关注JEECG发展历程 关注最新动态和版本, 记录JEECG成长点滴 更新日志 - 技术支持 - 招聘英才

JEECG最新版本下载 JEECG智能开发平台 - 显著提高开发效率 常见问题 - 入门视频 - 参与开源团队

商务QQ: 69893005、3102411850 商务热线(5*8小时): 010-64808099 官方邮箱: jeecgos@163.com

查看: 8846|回复: 1

JEECG 集成KiSSO单点登录实现统一身份认证

[复制链接]
发表于 2018-11-29 16:06:18 | 显示全部楼层 |阅读模式
JEECG 集成KiSSO单点登录实现统一身份认证
JEECG 如何为其他第三方系统实现统一身份认证服务,实现单点登录?

第三方系统如何对接呢?

今天为大家揭开这层面纱,让大家了解实质,使用它更快速的构建大家需要的业务

一、KISSO单点登录介绍

          kisso 采用的是加密会话 cookie 机制实现单点登录 SSO 服务,具备“无状态”、“分散验 证” 等特性。

         1、session 存放在服务器端,cookie 存放在客户端,存在 2 种状态:“ 第一种:持久 cookie 具有时效性,以文件的形式存放在客户机硬盘中, 时间一到生命周期结束自动被删除。第二种:临时 cookie 又叫会话 cookie 放在浏览器 内存中,浏览器关闭生命周期结束自动失效 ”。
          2、单纯不做任何改变而言 session 更安全,如果 cookie 采取各种安全保护措施,此时的 cookie 一样安全。
          3、cookie 轻松实现分布式服务部署,单点登录跨域访问等问题,换成 session 需要处理 session 复制及各种问题实现困难。

二、JEECG集成KiSSO实现统一身份认证服务

          JEECG系统作为服务端,实现统一身份认证服务,为其他第三方系统提供统一登录入口,共享用户资源,实现同一个用户名和密码登录多个系统。
          那JEECG如何实现的服务呢?下面切入正题。
         
1、服务端集成KISSO

              (1) JEECG 工程 Maven依赖相关的jar
  1. <!-- kisso begin -->
  2. <dependency>
  3.       <groupId>com.baomidou</groupId>
  4.       <artifactId>kisso</artifactId>
  5.       <version>3.6.11</version>
  6. </dependency>
  7. <dependency>
  8.        <groupId>com.alibaba</groupId>
  9.        <artifactId>fastjson</artifactId>
  10.        <version>1.2.15</version>
  11. </dependency>
  12. <!-- kisso end -->
复制代码
       (2)服务端项目配置文件。kisso启动配置有两种配置方式:spring方式初始化、Servlet方式初始化。根据不同的工程结构选择合适的配置方式,JEECG使用的是springMVC框架,我这里选择使用spring方式初始化方式。
           下面两种初始化方式如下:

            第一种:spring方式初始化方式
  1. <bean id="kissoInit" class="com.baomidou.kisso.web.WebKissoConfigurer" init-method="initKisso">
  2.             <property name="ssoPropPath" value="sso.properties" />
  3.             <!-- 不同环境配置选择设置 ,dev_mode/开发模式 ,test_mode/测试模式 ,online_mode/生产模式-->
  4.             <property name="runMode" value="test_mode" />
  5. </bean>
复制代码
       第二种:Servlet方式初始化
  1. <context-param>
  2.          <param-name>kissoConfigLocation</param-name>
  3.          <!-- SSO 属性文件地址根据实际项目配置 -->
  4.          <param-value>classpath:sso.properties</param-value>
  5. </context-param>
  6. <listener>
  7.          <listener-class>com.baomidou.kisso.web.KissoConfigListener</listener-class>
  8. </listener>
复制代码
    这两种方式,都会加载一个属性配置文件sso.properties该文件放到classpath下

    sso.properties 配置文件内容:
  1. <blockquote>#单点登录信息加密密钥
复制代码
        至此,服务端集成完成,sso.properties 需要注意的是:sso.secretkey单点登录信息加密密钥,此秘钥在登录完成后会把用户的信息通过此秘钥进行加密,保存到cookie中,为了安全不要泄露此密钥;sso.cookie.domain是单点登录域名配置,配置一级域名。JEECG服务端系统和第三方对接的客户端系统需要在同一个域名下,跨域的问题暂不考虑。

        本地调试时服务的访问一定要使用域名,系统host配置域名test.com即可。


2、JEECG统一身份认证服务代码实现原理

       JEECG系统集成配置完成,那么怎么实现的统一登录服务呢?
       JEECG系统原有的登录时不能给第三方系统提供统一登录服务,为了不印象原有的系统业务,我们需要另外实现一个登录入口代码如下:(
http://sso.test.com:8080/jeecg/toLogin.do
  1. /**
  2. * 单点登录
  3. * @author zhoujf
  4. *
  5. */
  6. @Controller
  7. @RequestMapping("/")
  8. public class SSOController extends BaseController{
  9.         private Logger log = Logger.getLogger(SSOController.class);
  10.         
  11.         
  12.         @RequestMapping(value = "toLogin")
  13.         public String toLogin(HttpServletRequest request) {
  14.                 String returnURL = request.getParameter("ReturnURL");
  15.                 log.info("SSO 资源路径returnURL:"+returnURL);
  16.                 request.setAttribute("ReturnURL", returnURL);
  17.                 return "login/login";
  18.         }
  19.         
  20.         
  21. }
复制代码
    第三方客户端集成KISSO后如果严重没有登录,则会跳转到这个地址进行登录,在跳转这个地址时会带一个参数ReturnURL,该参数是第三方系统当时访问的请求地址,JEECG服务端登录后会再回跳到这个地址。以上代码段在进入登录页面后把回跳地址带入登录页面,以便登录后回跳该地址
    那么服务端,登录回跳怎么实现的呢?下面在登录逻辑中增加如下代码即可实现:

  1. //-----------------------单点登录-------------------------------------------------
  2.                         /*
  3.                          * 单点登录 - 登录需要跳转登录前页面,自己处理 ReturnURL 使用
  4.                          * HttpUtil.decodeURL(xx) 解码后重定向
  5.                          */
  6.                         String returnURL = (String)request.getSession().getAttribute("ReturnURL");
  7.                         log.info("login 资源路径returnURL:"+returnURL);
  8.                         if(StringUtils.isNotEmpty(returnURL)){
  9.                                 SSOToken st = new SSOToken(request);
  10.                                 st.setId(UUID.randomUUID().getMostSignificantBits());
  11.                                 st.setUid(user.getUserName());
  12.                                 st.setType(1);
  13.                                 //request.setAttribute(SSOConfig.SSO_COOKIE_MAXAGE, maxAge);
  14.                                 // 可以动态设置 Cookie maxAge 超时时间 ,优先于配置文件的设置,无该参数 - 默认读取配置文件数据 。
  15.                                 //  maxAge 定义:-1 浏览器关闭时自动删除 0 立即删除 120 表示Cookie有效期2分钟(以秒为单位)
  16.                                 //request.setAttribute(SSOConfig.SSO_COOKIE_MAXAGE, 60);
  17.                                 SSOHelper.setSSOCookie(request, response, st, true);
  18.                                 returnURL = HttpUtil.decodeURL(returnURL);
  19.                                 log.info("login 资源路径returnURL:"+returnURL);
  20.                                 request.getSession().removeAttribute("ReturnURL");
  21.                                 try {
  22.                                         response.sendRedirect(returnURL);
  23.                                 } catch (IOException e) {
  24.                                         e.printStackTrace();
  25.                                 }
  26.                                 return null;
  27.                         }
  28.                         //------------------------单点登录----------------------------------------------

复制代码
    以上服务端统一登录服务就完成了!!!!

三、第三方系统对接JEECG统一认证服务

     1、第三方系统KISSO集成

       (1) 客户端 工程 Maven依赖相关的jar
  1. <!-- kisso begin -->
  2. <dependency>
  3.       <groupId>com.baomidou</groupId>
  4.       <artifactId>kisso</artifactId>
  5.       <version>3.6.11</version>
  6. </dependency>
  7. <dependency>
  8.        <groupId>com.alibaba</groupId>
  9.        <artifactId>fastjson</artifactId>
  10.        <version>1.2.15</version>
  11. </dependency>
  12. <!-- kisso end -->
复制代码
(2)第三方项目配置文件。kisso初始化以及登录验证拦截器配置有两种配置方式:spring方式初始化、Servlet方式初始化。根据不同的工程结构选择合适的配置方式,我这里第三方系统使用的也是springMVC框架,选择使用spring方式初始化方式。

           下面两种初始化方式如下:

            第一种:spring方式初始化方式
  1. <bean id="kissoInit" class="com.baomidou.kisso.web.WebKissoConfigurer" init-method="initKisso">
  2.             <property name="ssoPropPath" value="sso.properties" />
  3.             <!-- 不同环境配置选择设置 ,dev_mode/开发模式 ,test_mode/测试模式 ,online_mode/生产模式-->
  4.             <property name="runMode" value="test_mode" />
  5. </bean>

  6. <mvc:interceptors>
  7. <!-- SSO 登录验证拦截器 path 对所有的请求拦截使用/**,对某个模块下的请求拦截使用:/myPath/* -->
  8. <mvc:interceptor>
  9. <mvc:mapping path="/**" />
  10. <bean class="com.baomidou.kisso.web.interceptor.SSOSpringInterceptor" />
  11. </mvc:interceptor>
  12. <!-- SSO 系统权限拦截器 TODO 需要自己实现拦截器来控制权限处理(菜单权限,功能权限控制) -->

  13. </mvc:interceptors>

复制代码
   第二种:Servlet方式初始化
  1. <context-param>
  2.          <param-name>kissoConfigLocation</param-name>
  3.          <!-- SSO 属性文件地址根据实际项目配置 -->
  4.          <param-value>classpath:sso.properties</param-value>
  5. </context-param>
  6. <listener>
  7.          <listener-class>com.baomidou.kisso.web.KissoConfigListener</listener-class>
  8. </listener>

  9. <!-- SSOFilter use . -->
  10. <filter>
  11.        <filter-name>SSOFilter</filter-name>
  12.        <filter-class>com.baomidou.kisso.web.filter.SSOFilter</filter-class>
  13.        <init-param>
  14.        <param-name>over.url</param-name>
  15.        <!-- 不拦截的请求配置在这里 -->
  16.        <param-value>/index.jsp</param-value>
  17.        </init-param>
  18. </filter>
  19. <filter-mapping>
  20.        <filter-name>SSOFilter</filter-name>
  21.        <url-pattern>/*</url-pattern>
  22. </filter-mapping>

复制代码
    这两种方式,都会加载一个属性配置文件sso.properties该文件放到classpath下

    sso.properties 配置文件内容:
  1. #单点登录信息加密密钥
  2. sso.secretkey=Kisso4springMvc80mAS
  3. #cookie名称
  4. sso.cookie.name=uid
  5. #cookie单点服务器登录域名(本地测试需要host配置域名test.com,不能使用ip)
  6. sso.cookie.domain=.test.com
  7. #服务端登录地址
  8. sso.login.url=http://sso.test.com:8080/jeecg/toLogin.do
复制代码
    sso.properties 需要注意的是:sso.secretkey单点登录信息加密密钥,和服务端配置保持一致;
    sso.cookie.domain是单点登录域名配置,配置一级域名。和服务端配置保持一致;跨域的问题暂不考虑。
    sso.login.url   是服务端实现的统一登录服务入口地址
    本地调试时服务的访问一定要使用域名,系统host配置域名test.com即可。



    以上 第三方系统对接统一认证服务完成!!

2、测试验证方法

(1)启动JEECG服务端项目

(2)启动第三方系统

(3)找一个第三方系统的请求测试


    例如:http://sso.test.com/jeecg-p3-web/system/back.do?index

    请求后,未登录的情况下,跳转到JEECG统一认证系统进行登录,地址如下:
http://sso.test.com:8080/jeecg/toLogin.do?ReturnURL=http%253A%252F%252Fsso.test.com%252Fjeecg-p3-web%252Fsystem%252Fback.do%253Findex

11.png

    登录之后,回跳到地址 http://sso.test.com/jeecg-p3-web/system/back.do?index


22.png




发表于 2021-11-12 16:09:19 | 显示全部楼层
请问服务端和业务端都是jeecg平台,并且按照文中做了配置,但是SSOSpringInterceptor中preHandle(HttpServletRequest request, HttpServletResponse response, Object handler),参数handler不是HandlerMethod实例(直接返回请求路径内容,如logincontroller.do?login),而且浏览器cookies中也没有uid,是什么原因呢?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表