详见:https://www.yonghongtech.com/help/Z-Suite/8.7/ch/【菜单-系统集成-标准单点登录】 实现方式 永洪支持的单点登录是采用token验证的方式,下面详细介绍下这种方式。
token验证原理说明 客户在自己的系统中登录以后,希望能直接打开永洪的报表或者功能模块,但是这个用户可能之前没有在永洪系统中创建过。这种方式需要在报表或者功能模块的url后面附带token参数和sysFlag参数(sysFlag非必要,该参数作用是为了区分多个系统token验证的回调接口,根据参数的不同选取不同的回调地址,如果没有该参数或者该参数为空字符串,会去读取默认配置的url回调接口),当点击报表或者模块的url时,永洪系统拦截这些请求,调用客户系统提供的回调接口(需要客户开发)验证token是否是合法生成的,验证通过后回调接口返回当前用户信息。永洪系统会判断当前用户是否已经存在,如果不存在,会创建该用户,创建好后就直接登录系统,以避免出现登录页面。 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); } } |