<< Click to Display Table of Contents >> 标准单点登录 |
❖实现方式
永洪支持的单点登录是采用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);
}
}