简单实现Shiro单点登录(自定义Token令牌)

springboot+shiro简单token认证 前言 最后调用过程参考了 : https://blog.youkuaiyun.com/long270022471/article/details/62423286 最近可能要用到,所以看了看shiro. 结合人人开源的管理后端代码以及其他大佬的写的有关shiro的博文,自己整理了一下避免以后忘记了. 其中代码中我加了很多注释,是个人的通俗理解, 可能不正确, 也欢迎大家指出共同进步. Shiro的功能 Authentication:身份认证,验证用户是否拥有某个身份。 Authorization: 权限校验,验证某 阅读详情

 

2017年10月30日 17:27:11

阅读数:644

Java代码  

  1. /** 
  2.  * 单点登录(如已经登录,则直接跳转) 
  3.  * @param userCode 登录用户编码 
  4.  * @param token 登录令牌,令牌组成:sso密钥+用户名+日期,进行md5加密,举例:  
  5.  *      String secretKey = Global.getConfig("shiro.sso.secretKey"); 
  6.  *      String token = Digests.md5(secretKey + userCode + DateUtils.getDate("yyyyMMdd")); 
  7.  * @param url 登录成功后跳转的url地址。 
  8.  * @param relogin 是否重新登录,需要重新登录传递true 
  9.  * 例如:http://localhost/project/sso/{token}?url=xxx&relogin=true 
  10.  */  
  11. @RequestMapping(value = "sso/{userCode}/{token}")  
  12. public String sso(@PathVariable String userCode, @PathVariable String token,   
  13.         @RequestParam(required=true) String url, String relogin, Model model) {  
  14.     Principal principal = UserUtils.getPrincipal();  
  15.     // 如果已经登录  
  16.     if(principal != null){  
  17.         // 如果设置强制重新登录,则重新登录  
  18.         if (BooleanUtils.toBoolean(relogin)){  
  19.             UserUtils.getSubject().logout();  
  20.         }  
  21.         // 否则,直接跳转到目标页  
  22.         else{  
  23.             return "redirect:" + Encodes.urlDecode2(url);  
  24.         }  
  25.     }  
  26.     // 进行单点登录  
  27.     if (token != null){  
  28.         UsernamePasswordToken upt = new UsernamePasswordToken();  
  29.         try {  
  30.             upt.setUsername(userCode); // 登录用户名  
  31.             upt.setPassword(token.toCharArray()); // 密码组成:sso密钥+用户名+日期,进行md5加密,举例: Digests.md5(secretKey+username+20150101))  
  32.             upt.setParams(upt.toString()); // 单点登录识别参数,see: AuthorizingRealm.assertCredentialsMatch  
  33.         } catch (Exception ex){  
  34.             if (!ex.getMessage().startsWith("msg:")){  
  35.                 ex = new AuthenticationException("msg:授权令牌错误,请联系管理员。");  
  36.             }  
  37.             model.addAttribute("exception", ex);  
  38.         }  
  39.         try {  
  40.             UserUtils.getSubject().login(upt);  
  41.             return "redirect:" + Encodes.urlDecode2(url);  
  42.         } catch (AuthenticationException ae) {  
  43.             if (!ae.getMessage().startsWith("msg:")){  
  44.                 ae = new AuthenticationException("msg:授权错误,请检查用户配置,若不能解决,请联系管理员。");  
  45.             }  
  46.             model.addAttribute("exception", ae);  
  47.         }  
  48.     }  
  49.     return "error/403";  
  50. }  

 

2. 重载org.apache.shiro.realm.AuthorizingRealm类的assertCredentialsMatch方法

Java代码  

  1. /** 
  2.  * 认证密码匹配调用方法 
  3.  */  
  4. @Override  
  5. protected void assertCredentialsMatch(AuthenticationToken authcToken,  
  6.         AuthenticationInfo info) throws AuthenticationException {  
  7.     UsernamePasswordToken token = (UsernamePasswordToken) authcToken;  
  8.     // 若单点登录,则使用单点登录授权方法。  
  9.     if (token.toString().equals(token.getParams())){  
  10.         // sso密钥+用户名+日期,进行md5加密,举例: Digests.md5(secretKey+username+20150101))  
  11.         String secretKey = Global.getConfig("shiro.sso.secretKey");  
  12.         String password = Digests.md5(secretKey + token.getUsername() + DateUtils.getDate("yyyyMMdd"));  
  13.         if (password.equals(String.valueOf(token.getPassword()))){  
  14.             return;  
  15.         }  
  16.     }  
  17.     super.assertCredentialsMatch(token, info);  
  18. }  

 

3. 实现Shiro无状态访问,如通过传递sessionid参数即可实现会话访问

 这里需要自定义Shiro的SessionManager类,方法是继承org.apache.shiro.web.session.mgt.DefaultWebSessionManager类,重载getSessionId方法,如下:

 

Java代码  

  1. public class SessionManager extends DefaultWebSessionManager {  
  2.   
  3.     public SessionManager() {  
  4.         super();  
  5.     }  
  6.       
  7.     @Override  
  8.     protected Serializable getSessionId(ServletRequest request, ServletResponse response) {  
  9.         // 如果参数中包含“__sid”参数,则使用此sid会话。 例如:http://localhost/project?__sid=xxx&__cookie=true  
  10.         // 其实这里还可以使用如下参数:cookie中的session名称:如:JSESSIONID=xxx,路径中的 ;JESSIONID=xxx,但建议还是使用 __sid参数。  
  11.         String sid = request.getParameter("__sid");  
  12.         if (StringUtils.isNotBlank(sid)) {  
  13.             // 是否将sid保存到cookie,浏览器模式下使用此参数。  
  14.             if (WebUtils.isTrue(request, "__cookie")){  
  15.                 HttpServletRequest rq = (HttpServletRequest)request;  
  16.                 HttpServletResponse rs = (HttpServletResponse)response;  
  17.                 Cookie template = getSessionIdCookie();  
  18.                 Cookie cookie = new SimpleCookie(template);  
  19.                 cookie.setValue(sid); cookie.saveTo(rq, rs);  
  20.             }  
  21.             // 设置当前session状态  
  22.             request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE,  
  23.                     ShiroHttpServletRequest.URL_SESSION_ID_SOURCE); // session来源与url  
  24.             request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, sid);  
  25.             request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE);  
  26.             return sid;  
  27.         }else{  
  28.             return super.getSessionId(request, response);  
  29.         }  
  30.     }  
  31.    
  32. } 

     

     

    spring + shiro + cas 实现sso单点登录

    http://www.cnblogs.com/coderhuang/p/5897444.html

单点登录(基于Sa-Token-SSO) 单点登录详解。 阅读详情

相关推荐

学习笔记--基于Sa-Token 实现Java项目单点登录+同端互斥检测

如果用户每访问一个模块都要登录一次,那么这样就很麻烦了, 为了优化用户体验,需要一套机制将这N个系统的认证授权互通共享,让用户在一个系统登录之后,可以畅通无阻的访问其它所有系统。// 设置登录账号id为10001,第二个参数指定是否为[记住我],当此值为false后,关闭浏览器后再次打开需要重新登录。如果多个系统部署在不同的域名之下,但是后端可以连接同一个Redis,那么便可以使用 [URL重定向传播会话]按钮,由于此用户在SSO认证中心已有会话存在, 所以第四步也将自动化,也就是单点登录的最终目的。

欢迎来到空说的博客 1815

使用Sa-token实现单点登录

Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题

zjq852533445的博客 1万+

基于Shiro与Redis构建企业级单点登录系统:从原理到实践

在分布式系统架构中,统一身份认证是解决多系统登录体验割裂、提升运维效率的核心技术。其基本原理是通过一个集中的认证中心,实现用户一次登录、多系统通行的能力,核心在于安全的令牌管理、分布式会话与跨域通信。这一技术方案能显著提升用户体验、降低系统维护成本,广泛应用于企业后台管理、SaaS平台等需要多应用集成的场景。本文聚焦于如何利用Apache Shiro安全框架与Spring Data Redis,结合分布式会话管理和令牌验证机制,构建一个高可用、易扩展的单点登录解决方案,并深入探讨了Shiro安全漏洞防范与R

weixin_30906185的博客 312

shiro使用(使用token)

既然要做,就做的细致一点,对得起自己! 为什么使用token,请看这里 解决思路: 1.增加一个过滤器,对每一个请求都进行token的校验。如果为登录请求,则可以放过。 2.将过滤器设置进shiro中。 第一步:实现自定义ShiroFilter.这里选择继承FormAuthenticationFilter,至于为什么不继承AuthenticatingFilter,后面会解释。 从当前s...

本博客已迁移到 https://jacksparrow414.com 3万+

在PyCharm中配置使用Anaconda环境

在PyCharm中配置使用Anaconda环境一、步骤1.Anaconda2.PyCharm总结 一、步骤 1.Anaconda 如未安装Anaconda可至其官网下载,学习使用个人版就可以了。 下载地址:https://www.anaconda.com/products/individual 1、打开Anaconda Navigator,点击Environments可以看到anaconda中已经有了默认的“base”环境,其中包含了大多数我们会用到的包,在PyCharm中可以直接使用该环境,而无需自行下载

TuckX的博客 19万+

别只会‘pip install’了!当Python报错找不到‘pkg_resources’时,你的setuptools可能出大问题

本文深入解析Python开发中常见的`ModuleNotFoundError: No module named 'pkg_resources'`错误,揭示其背后的setuptools依赖问题。通过系统化的诊断与修复指南,帮助开发者理解Python包管理机制,并提供从基础到高级的解决方案,确保pip和setuptools的正常运行。

weixin_42523711的博客 437

java shiro 单点登录_简单实现Shiro单点登录(自定义Token令牌)

1. MVC Controller 映射 sso 方法。/*** 单点登录(如已经登录,则直接跳转)* @param userCode 登录用户编码* @param token 登录令牌,令牌组成:sso密钥+用户名+日期,进行md5加密,举例:* String secretKey = Global.getConfig("shiro.sso.secretKey");* String token =...

weixin_39575648的博客 565

分享一份小度在家1C系列NV2101刷机保姆级教程,轻松解锁第三方应用!(内含详细教程、刷机工具和救砖等工具)

分享一份小度在家1C系列NV2101刷机保姆级教程,轻松解锁第三方应用!(内含详细教程、刷机工具和救砖等工具)

XiaoqiangClub的博客 7208

java单点登录token_简单实现Shiro单点登录(自定义Token令牌)

/***单点登录(如已经登录,则直接跳转)*@paramuserCode登录用户编码*@paramtoken登录令牌,令牌组成:sso密钥+用户名+日期,进行md5加密,举例:*StringsecretKey=Global.getConfig("shiro.sso.secretKey");*Stringtoken=Digests.md5(secre...

weixin_26872311的博客 472

目标检测YOLO实战应用案例100讲-跨模态、多级别融合的RGB-D显著目标检测方法研究(续)

在第二章介绍了本研究的跨模态特征融合方法,第二章对于多级别特征的融合, 使用的是与基线模型baseline相同的方法:相邻级别的特征中,高级特征进行上采 样到与低级特征相同的尺度,再将高级特征通过降维得到与低级特征相同的通道数 量,最后对二者进行特征叠加,如此自顶向下的进行多级别的特征融合。本章主要 介绍本研究在特征层面的另一发现,并基于此发现引出的本文的第二个创新点:多 级别特征的融合方法。另外,在网络最深层,本文设计了一个新的模块来获取大的 感受野,对于大尺度目标能够增加更多语义信息,提升检测效果。 骨

qq_36130719的博客 469

Android 13.0 开机启动优化之PMS扫描apk耗时相关功能优化

在android13.0的系统rom定制化开发中,在系统中开发产品时,会根据客户要求内置第三方app,这时如果内置app过多,或者安装的app过多,在系统开机的过程中 在pms扫描安装app的时候,就会比较耗时,这时候就需要优化下pms扫描安装app这块的功能代码,用多线程来实现pms扫描安装app,来加快开机时间,接下来 来实现这个功能

安卓兼职framework和app工程师的博客 1335

shiro单点登录原理_shiro单点登录的简单实现

方式一 多次登录MVC Controller 的 sso 方法@RequestMapping(value = "ssoLogin.do")public String sso(String userName, String password,HttpServletRequest request, HttpServletResponse response) {AuthUser user = userD...

weixin_31837611的博客 1321

基于STM32、HAL库的SC16IS752IPW总线转UART驱动程序设计

/ FIFO空间不足。// 设置LCR寄存器的DLAB位为1以访问DLL/DLH。// 设置LCR寄存器,先访问DLL/DLH。// 设置LCR寄存器(不包含DLAB位)

corlin6688的博客 817

shiro 实现多种方式登录_shiro单点登录的简单实现

方式一 多次登录MVC Controller 的 sso 方法@RequestMapping(value = "ssoLogin.do")public String sso(String userName, String password,HttpServletRequest request, HttpServletResponse response) {AuthUser user = userD...

weixin_39589693的博客 1172

GEE训练教程:基于Sentinel-2卫星的归一化建筑指数(NDBI)等的进行城市扩张分析

本文介绍利用Sentinel-2卫星数据和谷歌地球引擎平台监测印度卡姆鲁普都会区2018-2024年城市扩张的方法。通过计算归一化建筑指数(NDBI)、植被指数(NDVI)和水体指数(MNDWI),采用多阈值规则识别建设用地,并量化不同年份的城市扩张面积。代码实现了从数据预处理、指数计算到面积统计的完整流程,为城市扩张研究提供了可复制的技术方案。关键参数包括年份选择、云覆盖阈值和分类阈值,均可根据研究需求调整。该方法能有效追踪城市边界变化,为城市规划提供数据支持。

此星光明博客 136

vue2/3 - 【超详细】最新网站接入使用支付宝支付功能,点击支付跳转新页面后生成订单及支付二维码,实现支付宝在线付款详细的教程(整个支付的完整配置及支付流程,一键复制源码开箱即用)!

vue支付宝付款,vue支付宝支付,vue如何实现支付宝在线付款,vue网页pc项目接入支付宝支付,vue支付宝支付详细教程,vue2支付宝在线支付的详细示例代码,vue如何做支付宝付款,vue怎么实现支付宝的付款功能,vue调用支付宝进行付款支付,vue PC项目实现 支付宝支付,vue h5页面调用支付宝支付,vue页面唤起支付宝支付功能,vue支付宝支付跳转到新页面,vue如何跳转新开一页展示支付宝二维码支付,vue怎么新开页面进行支付宝在线支付,vue新页面支付宝支付功能,前端vue支付宝支付教程,

✅ 精选推荐文章 5731

Shiro - 理解 Shiro 中 Token 的核心作用与自定义实现

Shiro Token机制解析与自定义实现 摘要 Apache Shiro中的Token是安全认证的核心组件,作为用户身份信息的载体和认证流程的起点。Token通过AuthenticationToken接口定义了标准化的认证凭据结构,解耦了认证逻辑与凭据表示。本文深入剖析了Shiro Token的设计原理,分析了其在认证流程中的关键作用,并提供了多种自定义Token的实现方案: Token核心机制:解释了Token作为"认证请求"标准化表示的本质,以及UsernamePasswordToken默认实现的使用

千淘万漉虽辛苦,吹尽狂沙始到金 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

shiro注销其他用户_单点登录多点注销shiro的简单实现

方式一 多次登录方式MVC Controller 的 sso 方法@RequestMapping(value = "ssoLogin.do")public String sso(String userName, String password,HttpServletRequest request, HttpServletResponse response) {AuthUser user = use...

weixin_34548449的博客 634

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

sso单点登录的原理详解,及Shiro同时支持Session和JWT Token两种认证方式,和Session和JWT整合方案

1. 单点登录是什么? 单点登录全称Single Sign On(以下简称SSO),是指在多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录,包括单点登录与单点注销两部分。 2. 单点登录的原理 相比于单系统登录,sso需要一个独立的认证中心,只有认证中心能接受用户的用户名密码等安全信息,其他系统不提供登录入口,只接受认证中心的间接授权。间接授权通过令牌实现,sso认证中心验证用户的用户名密码没问题,创建授权令牌,在接下来的跳转过程中,授权令牌作为参数发送给各...

阿啄debugIT 1684
上一篇: shiro框架实现单点登录
下一篇: shiro实现登录安全认证
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值