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,搭建单点登录系统相关推荐

  1. sso单点登录系统(解决session共享)

    场景:假设一个用户将自己的登录信息提交到后台,如果session保存的信息分布在多台机器上,并且不共享,那么可能导致用户的登录信息出现短暂的丢失,为什么这样讲,因为用户访问服务器中间还要经过负载均衡服 ...

  2. Shiro整合SSO单点登录系统

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/m0_37797991/article/ ...

  3. Springboot、React集成Okta SAML2单点登录

    一.背景: 由于公司内部系统很多,内网系统需集成Okta进行统一化单点登录,便于管理公司内部员工账号,无需每个系统都去维护账户信息,由于项目比较老,springboot是1.5.x版本的,所以未采用s ...

  4. 手撕一套sso(单点登录)系统之原理篇1

    在手撕之前,你首先要了解一些原理,我写的案例成品可以访问zauth,语言是Java8. 目录 1.关于Http 2.用户信息怎么存?存什么?存在哪? 2.1 使用前端存储技术Storage或index ...

  5. cas java单点登录_java单点登录系统CAS的简单使用

    http://blog.csdn.net/yunye114105/article/details/7997041 参考: http://blog.csdn.net/diyagea/article/de ...

  6. SpringBoot+MyBatis+Redis实现SSO单点登录系统(一)

    SpringBoot+MyBatis+Redis实现SSO单点登录系统(一) 一.SSO系统概述 SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可 ...

  7. CAS实现的单点登录系统

    单点登录(single sign on ),简称SSO. 纯属学习用,对来自网络的部分如果侵害了您的权力,请联系我.QQ:262800095 SSO的定义是在多个应用系统中,用户只需要登录一次就可以访 ...

  8. 单点登录系统的设计与实现方案

    目的: 对目前已有的 Web 应用系统,和将来待开发的 Web 应用系统系统进行集成,实现单点登录. 要求: 1. 对已有的 Web 应用系统不作大规模改造.    2. 不限制待开发的 Web 应用 ...

  9. php如何实现单点登录jira,JIRA 集成 Crowd 实现单点登录

    JIRA 集成 Crowd 实现单点登录 说明 如果你愿意每次都登录一遍 Atlassian 的产品(JIRA.Confluence.Fisheye),那么这篇文章就不适合你了,哈哈 首先贴上最详细的 ...

最新文章

  1. PyCharm Python3操作数据库MySQL增删改查
  2. 企业高管眼中的 SAP 和「智慧企业」| 品读中国企业数字化转型的故事
  3. 通过Clocking Wizard定制和生成一个IP核(MMCM)(Virtex7)(ISE版)
  4. 一个锁等待现象的诊断案例
  5. wcf客户端动态嗅探服务实例
  6. 这款可视化工具,Java 调优起来真的 so easy啊
  7. 关于JS中的定时器!!!
  8. 比较两个字符串的相似度算法
  9. ckfinder php 配置,php – 在Laravel 5中为CKEditor设置路径以使用CKFinder
  10. ASP+页缓存OutputCache Duration用法
  11. Java学习笔记(二)Java基本语法
  12. IOS UIColor 自定义颜色
  13. init 0 init1 init 3 init 5 init 6 这几个启动级别都代表什么意思
  14. 移动机器人场景应用对比分析
  15. 英特尔傲腾技术:部署更简单,内存提升游戏性能
  16. 数位板和sai2安装使用
  17. idea创建VUE项目
  18. 基于单神经元的自适应PID算法实现步骤与MATLAB代码
  19. 正在等待暴雪服务器响应,炉石传说无法通过暴雪战网服务进行登录,炉石传说,“游戏无法将你登陆至战网。请等待几分钟并再次尝试”...
  20. Python入门习题(89)——OpenJudge百练习题:二分法求函数的零点

热门文章

  1. 贝佐斯下定决心,先马斯克一步飞往太空
  2. 恶意软件现在分布在OneNote文件中以逃避防御
  3. mac系统谷歌浏览器一些问题
  4. Tcp连接端口占用问题
  5. EASTED 解决方案优势
  6. CNCF宣布金山云成为黄金级会员
  7. GaiaX开源解读 | 基于优酷业务特色的跨平台技术
  8. 千万别娶或者别嫁韩国人
  9. web前端学习笔记(最新)
  10. VS Code调试C/C++程序