Shiro集成kisso,搭建单点登录系统
kisso 是一个中间件,提供 cookie 搭建 java web sso 的组件式解决方案。
shiro是目前比较常用的轻量权限控制框架。
SpringBoot集成Shiro的文章比较多,我不多赘述。下面介绍SpringBoot集成kisso。
思路
- Spring集成Shiro
- Shiro托管项目session,使用Redis保存Shiro缓存信息
- SpringBoot集成kisso
- kisso单点登录同步shiro授权信息
步骤
1.SpringBoot集成Shiro
略。
2.Shiro托管项目session,使用Redis保存Shiro缓存信息
这个的详细操作过程在这个博文里介绍过了 https://my.oschina.net/qwzhang01/blog/1620339
3.SpringBoot集成kisso
1)添加配置文件sso.properties
sso.encoding=UTF-8
sso.secretkey=Kisso4SpringBootK80mAS
sso.cookie.name=uid
sso.cookie.domain=canyou.xyz
sso.cookie.maxage=7200
sso.login.url=http://canyou.xyz:8088/login
2)注入kisso组件
@Configuration
public class WebAppConfig extends WebMvcConfigurerAdapter {/*** 注入kisso拦截器** @param registry*/@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new SSOSpringInterceptor()).addPathPatterns("/**").excludePathPatterns("/login/**");super.addInterceptors(registry);}/*** 注入Kisso** @return*/@Bean(initMethod = "initKisso")public WebKissoConfigurer webKissoConfigurer() {WebKissoConfigurer webKissoConfigurer = new WebKissoConfigurer("sso.properties");return webKissoConfigurer;}
}
3)修改登录方法,登录成功,调用kisso,将登陆信息保存在cookie中
@RequestMapping(value = "/login/check", method = RequestMethod.POST)public String login(@RequestParam(value = "ReturnURL", defaultValue = "") String retuenUrl, LoginUserVo user, RedirectAttributes redirectAttributes, HttpServletRequest request, HttpServletResponse response) {if (StrUtil.hasBlank(user.getUsername(), user.getPassword(), user.getSafecode_iput())) {redirectAttributes.addFlashAttribute("msg", "用户名或密码验证码都均能为空");return "redirect:/login";}if (!CaptchaKit.validate(user.getSafecode_iput(), request)) {redirectAttributes.addFlashAttribute("msg", "验证码错误");return "redirect:/login";}User checkUser = userService.getByUserName(user.getUsername());if (checkUser == null) {redirectAttributes.addFlashAttribute("msg", "用户不存在,请核对后重新登录");return "redirect:/login";}String encrypt = ShiroCrypt.encrypt(user.getPassword());if (!checkUser.getPassword().equals(encrypt)) {redirectAttributes.addFlashAttribute("msg", "密码错误,请核对后重新登录");return "redirect:/login";}if (userService.login(checkUser.getUsername(), checkUser.getPassword())) {HttpSession session = request.getSession();session.setAttribute("username", checkUser.getUsername());session.setAttribute("fullName", checkUser.getRealname());// 单点登录核心代码SSOToken ssoToken = new SSOToken();ssoToken.setUid(user.getUsername());ssoToken.setApp("oms");ssoToken.setIp(IpHelper.getIpAddr(request));// 将sessionid保存在kisso的cookie里面ssoToken.setData(request.getSession().getId());SSOHelper.setSSOCookie(request, response, ssoToken, false);return "redirect:/";}redirectAttributes.addFlashAttribute("msg", "登陆失败");return "redirect:/login";}
至此,kisso集成完成。符合配置在sso.properties中的domain的域名cookie中,都会同步登陆信息。
但是目前只是把登陆信息同步在kisso里面了,对于shiro来说,不同应用之间的认证、授权信息并没有同步,因此需要在所有系统里面根据kisso,添加shiro的认证授权信息。
4.kisso单点登录同步shiro授权信息
上面已经实现了应用session由shiro托管,shiro缓存实现共享。给shiro添加filter,通过filter,对于符合kisso的单点登录条件的应用,通过kisso获取原来已经登录项目的sessionid,将其写入新应用的cookie里面,即实现将原已经授权认证的项目的shiro信息同步至新项目中。
import cn.hutool.core.util.StrUtil;
import com.baomidou.kisso.SSOHelper;
import com.baomidou.kisso.SSOToken;
import org.apache.shiro.web.filter.AccessControlFilter;
import org.springframework.stereotype.Component;import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Component
public class KissoFilter extends AccessControlFilter {@Overrideprotected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {HttpServletRequest httpServletRequest = (HttpServletRequest) request;String username = (String) httpServletRequest.getSession().getAttribute("username");return StrUtil.isNotBlank(username);}@Overrideprotected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {SSOToken ssoToken = SSOHelper.getToken((HttpServletRequest) request);if (ssoToken != null && ssoToken.getApp().equals("oms")) {Cookie cookie = new Cookie("csid", ssoToken.getData());cookie.setPath("/");((HttpServletResponse) response).addCookie(cookie);}return true;}
}
把filter注册为shiro的过滤器,过滤所有请求
@Beanpublic ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();shiroFilterFactoryBean.setSecurityManager(securityManager);Map<String, Filter> filterMap = new HashMap<>();filterMap.put("authc_kisso", new KissoFilter());filterMap.put("shiro_kisso", new KiSsoShiroAuthFilter());filterMap.put("logout_kisso", new KiSsoShiroLogoutFilter());shiroFilterFactoryBean.setFilters(filterMap);Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>(); filterChainDefinitionMap.put("/js/**", "anon");filterChainDefinitionMap.put("/css/**", "anon");filterChainDefinitionMap.put("/fonts/**", "anon");filterChainDefinitionMap.put("/login/logout", "logout_kisso");filterChainDefinitionMap.put("/login/**", "anon"); filterChainDefinitionMap.put("/**", "authc_kisso, shiro_kisso"); shiroFilterFactoryBean.setLoginUrl("/login");shiroFilterFactoryBean.setSuccessUrl("/index"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);return shiroFilterFactoryBean;}
传送门
- Shiro集成kisso,搭建单点登录系统完整版代码https://github.com/qwzhang01/bkcell_security
- kisso项目:https://my.oschina.net/u/2330181/blog/829233
转载于:https://my.oschina.net/qwzhang01/blog/1620564
Shiro集成kisso,搭建单点登录系统相关推荐
- sso单点登录系统(解决session共享)
场景:假设一个用户将自己的登录信息提交到后台,如果session保存的信息分布在多台机器上,并且不共享,那么可能导致用户的登录信息出现短暂的丢失,为什么这样讲,因为用户访问服务器中间还要经过负载均衡服 ...
- Shiro整合SSO单点登录系统
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37797991/article/ ...
- Springboot、React集成Okta SAML2单点登录
一.背景: 由于公司内部系统很多,内网系统需集成Okta进行统一化单点登录,便于管理公司内部员工账号,无需每个系统都去维护账户信息,由于项目比较老,springboot是1.5.x版本的,所以未采用s ...
- 手撕一套sso(单点登录)系统之原理篇1
在手撕之前,你首先要了解一些原理,我写的案例成品可以访问zauth,语言是Java8. 目录 1.关于Http 2.用户信息怎么存?存什么?存在哪? 2.1 使用前端存储技术Storage或index ...
- cas java单点登录_java单点登录系统CAS的简单使用
http://blog.csdn.net/yunye114105/article/details/7997041 参考: http://blog.csdn.net/diyagea/article/de ...
- SpringBoot+MyBatis+Redis实现SSO单点登录系统(一)
SpringBoot+MyBatis+Redis实现SSO单点登录系统(一) 一.SSO系统概述 SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可 ...
- CAS实现的单点登录系统
单点登录(single sign on ),简称SSO. 纯属学习用,对来自网络的部分如果侵害了您的权力,请联系我.QQ:262800095 SSO的定义是在多个应用系统中,用户只需要登录一次就可以访 ...
- 单点登录系统的设计与实现方案
目的: 对目前已有的 Web 应用系统,和将来待开发的 Web 应用系统系统进行集成,实现单点登录. 要求: 1. 对已有的 Web 应用系统不作大规模改造. 2. 不限制待开发的 Web 应用 ...
- php如何实现单点登录jira,JIRA 集成 Crowd 实现单点登录
JIRA 集成 Crowd 实现单点登录 说明 如果你愿意每次都登录一遍 Atlassian 的产品(JIRA.Confluence.Fisheye),那么这篇文章就不适合你了,哈哈 首先贴上最详细的 ...
最新文章
- PyCharm Python3操作数据库MySQL增删改查
- 企业高管眼中的 SAP 和「智慧企业」| 品读中国企业数字化转型的故事
- 通过Clocking Wizard定制和生成一个IP核(MMCM)(Virtex7)(ISE版)
- 一个锁等待现象的诊断案例
- wcf客户端动态嗅探服务实例
- 这款可视化工具,Java 调优起来真的 so easy啊
- 关于JS中的定时器!!!
- 比较两个字符串的相似度算法
- ckfinder php 配置,php – 在Laravel 5中为CKEditor设置路径以使用CKFinder
- ASP+页缓存OutputCache Duration用法
- Java学习笔记(二)Java基本语法
- IOS UIColor 自定义颜色
- init 0 init1 init 3 init 5 init 6 这几个启动级别都代表什么意思
- 移动机器人场景应用对比分析
- 英特尔傲腾技术:部署更简单,内存提升游戏性能
- 数位板和sai2安装使用
- idea创建VUE项目
- 基于单神经元的自适应PID算法实现步骤与MATLAB代码
- 正在等待暴雪服务器响应,炉石传说无法通过暴雪战网服务进行登录,炉石传说,“游戏无法将你登陆至战网。请等待几分钟并再次尝试”...
- Python入门习题(89)——OpenJudge百练习题:二分法求函数的零点