`

shiro绕过密码登录的session丢失问题

 
阅读更多



 由于项目的需要,别的平台需要单点登录到当前系统,单点登录的时候会推送一个token值过来,通过解析token值获取相关信息,由于推送过来的token只包含账号信息,是不包含密码信息的,所以就想到了绕过密码登录的方案,因为我们的项目使用了shiro安全框架,会话都交给了shiro去管理。所以就从网上搜索到了下面这样一个实现:

 

在某些应用场景下我们或许需要直接登录,而不需要用户输入密码,例如用户用手机直接登录的场景。

在Shiro中我们通过在线程变量中绑定一个已通过验证的Subject对象即可实现。

 

Java代码  收藏代码
  1. PrincipalCollection principals = new SimplePrincipalCollection(  
  2.                 user.getId(), "MobileRealm");  
  3. Builder builder = new WebSubject.Builder(  
  4.                 ServletActionContext.getRequest(),  
  5.                 ServletActionContext.getResponse());  
  6. builder.principals(principals);  
  7. builder.authenticated(true);  
  8. WebSubject subject = builder.buildWebSubject();  
  9. ThreadContext.bind(subject);  

 

以上是用于Web Application的代码,所以用的是WebSubject,应根据自己的应用选择需要创建的Subject类。

 

通过以上的方式发现有一个问题,就是发送请求构建subject的时候该请求的响应总是发送c了两个jsessionid,如下图:
c
 

 导致放到session中的值使用的会话标志是第一个sid,而第二个sid会覆盖第一个,这样就会出现session丢失的情况。

 

问题原因:

使用WebSubject.Builder构建subject的时候会产生一个sessionId,而代码中HttpSession.setAttribute()这个方法也会产生一个sessionId.因此会导致产生两个sessionId导致会话丢失的问题。

 

解决方法:

设置WebSubject.Builder的sessionid为HttpSession的Id即可,如下代码:

builder.sessionId(session.getId());

 

 

  • 大小: 11.4 KB
分享到:
评论

相关推荐

    springboot +shiro+redis实现session共享(方案二)1

    本文档旨在介绍如何使用 Spring Boot、Shiro 和 Redis 实现分布式 session 共享,以解决 Web 应用程序的登录 session 统一问题。 2. 相关依赖 在实现 session 共享之前,需要在项目中引入相关依赖项,包括: * ...

    nginx+tomcat shiro实现多tomcat下session共享

    例如,Redis的数据备份和恢复策略,以及防止因网络问题导致的session丢失或重复。 7. **性能优化**: 可以通过设置合适的session过期时间、使用Redis的持久化机制以及监控Redis的性能,来优化session共享的效率和...

    SpringBoot整合Shiro示例实现动态权限加载更新+Session共享+单点登录

    SpringBoot整合Shiro示例实现动态权限加载更新+Session共享+单点登录 SpringBoot整合Shiro示例实现动态权限加载更新+Session共享+单点登录 SpringBoot整合Shiro示例实现动态权限加载更新+Session共享+单点登录 ...

    shiro redis session共享

    而Redis则是一个高性能的键值存储系统,常用于实现分布式环境下的session共享,以解决单体应用或微服务架构中的session粘滞性问题。 描述中提到的"数据库、redis改为本地"意味着在配置中,Redis服务器可能被设置为...

    shiro+redis做session管理

    在IT行业中,Session管理是Web应用中的重要环节,它用于维护用户登录状态,确保用户在不同请求间的数据一致性。在大型分布式系统中,由于多台服务器之间无法共享内存,传统的Session管理方式不再适用。这时,我们...

    shiro-redisson基于Redis的ShiroCache和Session实现

    `shiro-redisson` 模块就是为了解决这个问题,将 Shiro 的缓存(Cache)和会话(Session)管理功能与 Redis 结合,实现了基于 Redis 的分布式解决方案。 1. **Redisson 库的介绍** Redisson 是一个全面的 Redis ...

    SpringBoot+Shiro学习之密码加密和登录失败次数限制示例

    SpringBoot+Shiro学习之密码加密和登录失败次数限制示例 本篇文章主要介绍了 SpringBoot 与 Shiro 的整合,实现密码加密和登录失败次数限制的示例。该示例中,使用 Shiro 框架来实现登录失败次数限制,并使用 ...

    shiro+redis session共享实现

    首先,Shiro框架的Session管理是基于内存的,这意味着默认情况下,每个Web服务器都会独立维护其自身的session数据。但在分布式环境中,用户可能会在多个服务器之间跳转,这就需要一个统一的session存储机制,以便...

    SSM项目集成shiro搭建session共享

    SSM项目集成Shiro搭建session共享是一个常见的需求,特别是在构建分布式系统时,为了实现用户登录状态在多个服务器间的一致性。在这个项目中,我们使用了SpringMvc4.3、Spring4.3、Mybatis3.4作为基础框架,Shiro1.4...

    shiro+spring+data+session+redis实现单点登录

    本案例聚焦于使用Apache Shiro、Spring、Spring Data以及Redis来实现单点登录功能,下面将详细解释这些组件以及它们如何协同工作。 **Apache Shiro** Apache Shiro是一款轻量级的安全框架,提供了认证、授权、会话...

    基于spring redis的shiro session共享

    shiro 框架没有用tomcat的session,而是重新实现了一套。所以系统一旦引入shiro后,采用传统的tomcat session共享机制是无效的,必须采用面向shiro 的session共享。 网上针对“shiro session共享”的文章比较多,...

    springboot整合shiro,redis缓存session

    为实现Web应用的分布式集群部署,要解决登录session的统一。本文利用shiro做权限控制,redis做session存储,结合spring boot快速配置实现session共享。

    shiro获取登录状态和用户信息

    Shiro 提供了多种方式来获取当前用户的登录状态,其中一种常用的方式是通过Session来获取。 ##### 2.1 检查登录状态代码示例 ```java public boolean isAuthenticated(String sessionID, HttpServletRequest ...

    springboot+shiro+redis整合

    将SpringBoot、Shiro和Redis整合,主要目的是利用Shiro进行用户认证和授权,而Redis作为Session的共享存储,解决分布式环境下的会话一致性问题。以下是整合步骤: 1. **引入依赖**:在SpringBoot的pom.xml文件中...

    SpringBoot整合Shiro后实现免密登录

    2,新增CustomToken,重写UsernamePasswordToken免密登录调用方法和密码登录调用方法都在里面。 3,新增MyRetryLimitCredentialsMatcher,重写HashedCredentialsMatcher,主要是判定登录是否是免密登录。 4,新增...

    shiro的session中的会话管理

    在分布式系统或微服务架构中,会话管理成为一个关键问题,因为默认情况下,Shiro的session管理是基于单个服务器的,无法在多台服务器之间共享用户会话信息。 在传统的Web应用中,session信息通常存储在服务器的内存...

    一个服务器搭多个tomcat导致session丢失,或者同一个IP不同端口,多个应用的session会冲突解决方法

    如:A,B两个服务,在浏览器中登录访问A后,当前打开的浏览器上在开一个选项卡访问B服务后,回过来点击访问A时session丢失,需要重新登录A才可以访问。经过资料查找,发现问题是因为:IP相同认为是同一个域,接收了B...

    shiro实现单点登录

    通过以上步骤,我们便能成功地利用Spring、Shiro、Spring Data Redis和Spring Session Data Redis实现单点登录功能。这个解决方案不仅提供了便捷的用户体验,还降低了系统复杂性,提高了安全性。在实际开发中,可以...

    shiro权限绕过漏洞分析(cve-2020-1957) _ Spoock1

    然而,如标题和描述中提到的,存在一个名为CVE-2020-1957的安全漏洞,允许攻击者绕过Shiro的权限检查,从而访问受保护的资源。 该漏洞主要发生在Shiro 1.5.1及更早版本中,当用户请求的URL(URL1)通过Shiro的权限...

    shiro 新手鼓捣了一天终于搞好了。。还差个分布式session

    在本文中,我们将深入探讨 Shiro 的基本概念以及如何与 SpringMVC 集成,同时会简要提及分布式会话管理的问题。 1. **Shiro 概述** - **身份认证**:验证用户的身份,确保用户是他们声称的那个人。Shiro 提供了...

Global site tag (gtag.js) - Google Analytics