标准单点登录

<< Click to Display Table of Contents >>

当前位置:  系统集成 

标准单点登录

Previous pageReturn to chapter overviewNext page

实现方式

永洪支持的单点登录是采用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);

 }

}