永洪社区

标题: 标准单点登录介绍 [打印本页]

作者: 寻找新技能    时间: 2021-4-7 16:24
标题: 标准单点登录介绍

详见:https://www.yonghongtech.com/help/Z-Suite/8.7/ch/【菜单-系统集成-标准单点登录】

实现方式

永洪支持的单点登录是采用token验证的方式,下面详细介绍下这种方式。

token验证原理说明

客户在自己的系统中登录以后,希望能直接打开永洪的报表或者功能模块,但是这个用户可能之前没有在永洪系统中创建过。这种方式需要在报表或者功能模块的url后面附带token参数和sysFlag参数(sysFlag非必要,该参数作用是为了区分多个系统token验证的回调接口,根据参数的不同选取不同的回调地址,如果没有该参数或者该参数为空字符串,会去读取默认配置的url回调接口),当点击报表或者模块的url时,永洪系统拦截这些请求,调用客户系统提供的回调接口(需要客户开发)验证token是否是合法生成的,验证通过后回调接口返回当前用户信息。永洪系统会判断当前用户是否已经存在,如果不存在,会创建该用户,创建好后就直接登录系统,以避免出现登录页面。

single-login

Token和回调接口由客户系统生成,出于以下理由:

当用户从客户系统进入永洪系统中时可能在永洪系统中并不存在,这时候永洪需要从客户系统中获取当前用户信息,在永洪系统中自动创建,才能访问永洪系统。用token而不是直接传递用户名是为了安全考虑,需要先验证下。

Token和回调接口需要满足以下条件:

根据当前登录用户的当前会话生成,每次都不一样,可以采用hash算法或者其他算法。

客户需要开发接口,来验证永洪回传的接口,以及根据token来返回当前登录用户相关信息。

??Token回调使用

token回调接口说明

请求地址

callback.url

请求参数(post方式)

{

token: E2ABA91383139F9D4B4D7C1E0226FA1B

}

返回参数

{

"result": "success",

"userId": "john",

"userAlias": "john",

"userEmail": "john@.com",

"userRoles": "角色1,角色2",

"userGroups": "组1/组1子组,组2/组2子组",

"param":{

"department": "总部",

"city": "北京",

"xxx": "xxx"

}

}

??注:

回调验证token接口,可以使用post方式验证,参数名是 token

回调验证token接口验证成功,返回的结果中必须有 result和userId 。result的值为success代表接口回调成功,如果返回其他值为失败。userId即是永洪中的用户名。userAlias可选,是用户别名。userEmail可选,是用户邮箱。userRoles可选,是用户角色,如果用户有多个角色以逗号分隔。userGroups可选,是用户组,如果用户属于多个组以逗号分隔,需写入组的全路径,多层级组以”/”分隔。param可选,对应一个json对象,里面存储需要放到产品内置参数中的数据,可用来进行数据权限过滤。

token传递方式

token可以放在url后面,也可以通过post提交也可以放在header里面。放在url后面举例如:

http://localhost:8080/bi/Viewer?proc=1&token=E2ABA91383139F9D4B4D7C1E0226FA1B

客户的回调接口java代码举例

(不能直接使用,需要客户完善)

package com.customer.service;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.*;

public class TokenCheckServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

public TokenCheckServlet() {

super();

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

String token = request.getParameter("token");

if(token == null || "".equals(token.trim())) {

// 客户自己的错误处理逻辑

return;

}

else {

// 校验token是否合法

StringBuilder responseStr = new StringBuilder();

if(check(token)) {

// token验证通过就返回当前登录用户。对应永洪系统中的用户名。

responseStr.append("{\"result\":\"success\",\"userId\":\"test\"}");

}

else {

// token验证没通过就不返回userId。

responseStr.append("{\"error\":\"james\"}");

}

response.getWriter().write(responseStr.toString());

}

}

private boolean check(String token) {

return true;

}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

doGet(request, response);

}

}


作者: ngm    时间: 2021-7-15 14:31
感觉不对啊,为什么我尝试的是token是账号
作者: 环环    时间: 2021-7-15 14:42
你是直接拼接的账号吧,token是你们系统生成的




欢迎光临 永洪社区 (https://club.yonghongtech.com/) Powered by Discuz! X3.4