JEECG 集成KiSSO单点登陆实现统一身份认证java
JEECG 如何为其余第三方系统实现统一身份认证服务,实现单点登陆?
第三方系统如何对接呢?
今天为你们揭开这层面纱,让你们了解实质,使用它更快速的构建你们须要的业务
1、KISSO单点登陆介绍
kisso 采用的是加密会话 cookie 机制实现单点登陆 SSO 服务,具有“无状态”、“分散验 证” 等特性。
一、session 存放在服务器端,cookie 存放在客户端,存在 2 种状态:“ 第一种:持久 cookie 具备时效性,以文件的形式存放在客户机硬盘中, 时间一到生命周期结束自动被删除。第二种:临时 cookie 又叫会话 cookie 放在浏览器 内存中,浏览器关闭生命周期结束自动失效 ”。
二、单纯不作任何改变而言 session 更安全,若是 cookie 采起各类安全保护措施,此时的 cookie 同样安全。
三、cookie 轻松实现分布式服务部署,单点登陆跨域访问等问题,换成 session 须要处理 session 复制及各类问题实现困难。
2、JEECG集成KiSSO实现统一身份认证服务
JEECG系统做为服务端,实现统一身份认证服务,为其余第三方系统提供统一登陆入口,共享用户资源,实现同一个用户名和密码登陆多个系统。
那JEECG如何实现的服务呢?下面切入正题。
一、服务端集成KISSO
(1) JEECG 工程 Maven依赖相关的jarweb
<!-- 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方式初始化方式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方式初始化json
<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 配置文件内容:跨域
至此,服务端集成完成,sso.properties 须要注意的是:sso.secretkey单点登陆信息加密密钥,此秘钥在登陆完成后会把用户的信息经过此秘钥进行加密,保存到cookie中,为了安全不要泄露此密钥;sso.cookie.domain是单点登陆域名配置,配置一级域名。JEECG服务端系统和第三方对接的客户端系统须要在同一个域名下,跨域的问题暂不考虑。
本地调试时服务的访问必定要使用域名,系统host配置域名test.com便可。
二、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; } //------------------------单点登陆----------------------------------------------
以上服务端统一登陆服务就完成了!!!!
3、第三方系统对接JEECG统一认证服务
一、第三方系统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方式初始化方式cookie
<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方式初始化session
<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便可。
以上 第三方系统对接统一认证服务完成!!
二、测试验证方法
(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