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

<!-- kisso begin -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>kisso</artifactId>
<version>3.6.11</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.15</version>
</dependency>
<!-- kisso end -->

(2)服务端项目配置文件。kisso启动配置有两种配置方式:spring方式初始化、Servlet方式初始化。根据不同的工程结构选择合适的配置方式,JEECG使用的是springMVC框架,我这里选择使用spring方式初始化方式。
           下面两种初始化方式如下:
            第一种:spring方式初始化方式

<bean id="kissoInit" class="com.baomidou.kisso.web.WebKissoConfigurer" init-method="initKisso">
<property name="ssoPropPath" value="sso.properties" />
<!-- 不同环境配置选择设置 ,dev_mode/开发模式 ,test_mode/测试模式 ,online_mode/生产模式-->
<property name="runMode" value="test_mode" />
</bean>

第二种:Servlet方式初始化

<context-param>
<param-name>kissoConfigLocation</param-name>
<!-- SSO 属性文件地址根据实际项目配置 -->
<param-value>classpath:sso.properties</param-value>
</context-param>
<listener>
<listener-class>com.baomidou.kisso.web.KissoConfigListener</listener-class>
</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

/**
* 单点登录
* @author zhoujf
*
*/
@Controller
@RequestMapping("/")
public class SSOController extends BaseController{
private Logger log = Logger.getLogger(SSOController.class); @RequestMapping(value = "toLogin")
public String toLogin(HttpServletRequest request) {
String returnURL = request.getParameter("ReturnURL");
log.info("SSO 资源路径returnURL:"+returnURL);
request.setAttribute("ReturnURL", returnURL);
return "login/login";
} }

第三方客户端集成KISSO后如果严重没有登录,则会跳转到这个地址进行登录,在跳转这个地址时会带一个参数ReturnURL,该参数是第三方系统当时访问的请求地址,JEECG服务端登录后会再回跳到这个地址。以上代码段在进入登录页面后把回跳地址带入登录页面,以便登录后回跳该地址
    那么服务端,登录回跳怎么实现的呢?下面在登录逻辑中增加如下代码即可实现:

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

    以上服务端统一登录服务就完成了!!!!

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

     1、第三方系统KISSO集成

(1) 客户端 工程 Maven依赖相关的jar

<!-- kisso begin -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>kisso</artifactId>
<version>3.6.11</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.15</version>
</dependency>
<!-- kisso end -->

(2)第三方项目配置文件。kisso初始化以及登录验证拦截器配置有两种配置方式:spring方式初始化、Servlet方式初始化。根据不同的工程结构选择合适的配置方式,我这里第三方系统使用的也是springMVC框架,选择使用spring方式初始化方式。

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

第一种:spring方式初始化方式

<bean id="kissoInit" class="com.baomidou.kisso.web.WebKissoConfigurer" init-method="initKisso">
<property name="ssoPropPath" value="sso.properties" />
<!-- 不同环境配置选择设置 ,dev_mode/开发模式 ,test_mode/测试模式 ,online_mode/生产模式-->
<property name="runMode" value="test_mode" />
</bean> <mvc:interceptors>
<!-- SSO 登录验证拦截器 path 对所有的请求拦截使用/**,对某个模块下的请求拦截使用:/myPath/* -->
<mvc:interceptor>
<mvc:mapping path="/**" />
<bean class="com.baomidou.kisso.web.interceptor.SSOSpringInterceptor" />
</mvc:interceptor>
<!-- SSO 系统权限拦截器 TODO 需要自己实现拦截器来控制权限处理(菜单权限,功能权限控制) --> </mvc:interceptors>

第二种:Servlet方式初始化

<context-param>
<param-name>kissoConfigLocation</param-name>
<!-- SSO 属性文件地址根据实际项目配置 -->
<param-value>classpath:sso.properties</param-value>
</context-param>
<listener>
<listener-class>com.baomidou.kisso.web.KissoConfigListener</listener-class>
</listener> <!-- SSOFilter use . -->
<filter>
<filter-name>SSOFilter</filter-name>
<filter-class>com.baomidou.kisso.web.filter.SSOFilter</filter-class>
<init-param>
<param-name>over.url</param-name>
<!-- 不拦截的请求配置在这里 -->
<param-value>/index.jsp</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SSOFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

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

sso.properties 配置文件内容:

#单点登录信息加密密钥
sso.secretkey=Kisso4springMvc80mAS
#cookie名称
sso.cookie.name=uid
#cookie单点服务器登录域名(本地测试需要host配置域名test.com,不能使用ip)
sso.cookie.domain=.test.com
#服务端登录地址
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

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

 

JEECG 集成KiSSO单点登录实现统一身份认证的更多相关文章

  1. 记录使用Python登录浙江大学统一身份认证

    背景 现在每天要进行健康情况上报,但是因为经常睡过头忘记打卡,于是想着写一个程序来自动打卡. 统一身份认证 访问健康情况上报页面(https://healthreport.zju.edu.cn/nco ...

  2. SSO单点登录统一身份认证系统

    什么是单点登录 简单点说就是公司有A,B两个系统,我登录了A系统之后再跳转到B系统可以直接访问,而不需要再次登录B系统. 几种常见的单点登录实现方式 在讲解单点登录之前先讲解几个基本的概念: Cook ...

  3. 【.NET Core微服务实战-统一身份认证】开篇及目录索引

    简介 ​ 学习.NETCORE也有1年多时间了,发现.NETCORE项目实战系列教程很少,都是介绍开源项目或基础教程,对于那些观望的朋友不能形成很好的学习思路,遇到问题怕无法得到解决而不敢再实际项目中 ...

  4. 构建基于分布式SOA架构的统一身份认证体系

    摘要:本文充分利用SOA架构松耦合的特点,通过规范统一网络接口实现业务系统整合,既提升系统安全性,又简化资源访问操作,具有重要的理论和现实意义. 统一身份认证旨在将分散在各个信息系统中的用户和权限资源 ...

  5. 基于DDD + SD.Framework实现的统一身份认证系统

    项目地址 http://git.oschina.net/lishilei0523/ShSoft.UAC 项目说明 本项目开发的目的有三: 1.作为一个使用SD.Framework框架开发的项目样板 2 ...

  6. 中国科学技术大学统一身份认证系统CAS

    CAS | Apereohttps://www.apereo.org/projects/cas 中国科学技术大学统一身份认证系统https://passport.ustc.edu.cn/login?s ...

  7. 配置用户通过Telnet登录设备的身份认证(AAA本地认证)

    背景信息 用户通过Telnet登录设备时,设备上必须配置验证方式,否则用户无法成功登录设备.设备支持不认证.密码认证和AAA认证三种用户界面的验证方式,其中AAA认证方式安全性最高. 采用AAA本地认 ...

  8. token机制完成登录状态保持/身份认证

    一般APP都是刚安装后,第一次启动时需要登录(提示你需要登录或者直接启动在登录界面).而只要登录成功后,以后每次启动时都是登录状态,不需要每次启动时再次登录.不过,也有些APP若你长期未启动,再次启动 ...

  9. SpringBoot集成CAS单点登录,SSO单点登录,CAS单点登录(视频资料分享篇)

    单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 很早期的公司 ...

随机推荐

  1. STM32 BOR/POR/PDR介绍

    以STM32为例,介绍单片机中的BOR/POR/PDR1)PVD = Programmable Votage Detector 可编程电压监测器 它的作用是监视供电电压,在供电电压下降到给定的阀值以下 ...

  2. Jquery的动态切换图片

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. 跳台阶(JAVA)

    跳台阶 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 思路:典型的动态规划问题,动态规划问题最关键的是把事件中的各种情形抽象为状态,然后找到前后 ...

  4. KiCad EDA 原理图库的最佳实践

    KiCad EDA 原理图库的最佳实践 由于有 Alias 别名元件,可以不用一个每一个元件都有一个元件. 对每种元件类型建议一个元件库. 因为 Value 和 元件名是一样的,所以元件名要尽可能的简 ...

  5. sqlserver数据库不能重命名报错5030——我的一点小思考

    在学习asp.net的时候使用mssql‘经常会出现这种错误,数据库不能重名名5030的错误,其实很简单原因就是有应用程序正在占用这个连接,使用这样一行命令就可以查询出正在占用的连接 use mast ...

  6. node.js 远程调试debug产线环境代码

    一.背景: 产线机器出bug,不能重启服务,需要保留现场,问题不好排查,只能靠远程debug. 二.实现步骤 1. 登录远程机器执行如下命令,nodePid为node服务的pid kill -usr1 ...

  7. java获取客户端ip地址工具类

    public class IpUtils { private static final String[] HEADERS = { "X-Forwarded-For", " ...

  8. 使用iframe方式获得svg中的DOM元素,和svg 的 contentDocument 返回 null

    碰到这个的相关问题,百度找了好久,找到了个解决方法,原址 https://segmentfault.com/q/1010000009001758 var iframe = document.getEl ...

  9. js 浏览器窗口大小改变 高度 宽度获取 window/document.height()区别

    <script> //当浏览器的窗口大小被改变时触发的事件window.onresize window.onresize = function(){ console.log($(windo ...

  10. JumpServer 安装配置

    环境 系统:Centos 7.4 阿里云ECS,单独绑定弹性公网IP 关闭selinux,防火墙对本机公司IP全开 #CentOS 7 $ setenforce 0 # 临时关闭,重启后失效 #修改字 ...