由于项目的需要,别的平台需要单点登录到当前系统,单点登录的时候会推送一个token值过来,通过解析token值获取相关信息,由于推送过来的token只包含账号信息,是不包含密码信息的,所以就想到了绕过密码登录的方案,因为我们的项目使用了shiro安全框架,会话都交给了shiro去管理。所以就从网上搜索到了下面这样一个实现:
在某些应用场景下我们或许需要直接登录,而不需要用户输入密码,例如用户用手机直接登录的场景。
在Shiro中我们通过在线程变量中绑定一个已通过验证的Subject对象即可实现。
- PrincipalCollection principals = new SimplePrincipalCollection(
- user.getId(), "MobileRealm");
- Builder builder = new WebSubject.Builder(
- ServletActionContext.getRequest(),
- ServletActionContext.getResponse());
- builder.principals(principals);
- builder.authenticated(true);
- WebSubject subject = builder.buildWebSubject();
- 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());
相关推荐
本文档旨在介绍如何使用 Spring Boot、Shiro 和 Redis 实现分布式 session 共享,以解决 Web 应用程序的登录 session 统一问题。 2. 相关依赖 在实现 session 共享之前,需要在项目中引入相关依赖项,包括: * ...
例如,Redis的数据备份和恢复策略,以及防止因网络问题导致的session丢失或重复。 7. **性能优化**: 可以通过设置合适的session过期时间、使用Redis的持久化机制以及监控Redis的性能,来优化session共享的效率和...
SpringBoot整合Shiro示例实现动态权限加载更新+Session共享+单点登录 SpringBoot整合Shiro示例实现动态权限加载更新+Session共享+单点登录 SpringBoot整合Shiro示例实现动态权限加载更新+Session共享+单点登录 ...
而Redis则是一个高性能的键值存储系统,常用于实现分布式环境下的session共享,以解决单体应用或微服务架构中的session粘滞性问题。 描述中提到的"数据库、redis改为本地"意味着在配置中,Redis服务器可能被设置为...
在IT行业中,Session管理是Web应用中的重要环节,它用于维护用户登录状态,确保用户在不同请求间的数据一致性。在大型分布式系统中,由于多台服务器之间无法共享内存,传统的Session管理方式不再适用。这时,我们...
SpringBoot+Shiro学习之密码加密和登录失败次数限制示例 本篇文章主要介绍了 SpringBoot 与 Shiro 的整合,实现密码加密和登录失败次数限制的示例。该示例中,使用 Shiro 框架来实现登录失败次数限制,并使用 ...
`shiro-redisson` 模块就是为了解决这个问题,将 Shiro 的缓存(Cache)和会话(Session)管理功能与 Redis 结合,实现了基于 Redis 的分布式解决方案。 1. **Redisson 库的介绍** Redisson 是一个全面的 Redis ...
首先,Shiro框架的Session管理是基于内存的,这意味着默认情况下,每个Web服务器都会独立维护其自身的session数据。但在分布式环境中,用户可能会在多个服务器之间跳转,这就需要一个统一的session存储机制,以便...
SSM项目集成Shiro搭建session共享是一个常见的需求,特别是在构建分布式系统时,为了实现用户登录状态在多个服务器间的一致性。在这个项目中,我们使用了SpringMvc4.3、Spring4.3、Mybatis3.4作为基础框架,Shiro1.4...
本案例聚焦于使用Apache Shiro、Spring、Spring Data以及Redis来实现单点登录功能,下面将详细解释这些组件以及它们如何协同工作。 **Apache Shiro** Apache Shiro是一款轻量级的安全框架,提供了认证、授权、会话...
shiro 框架没有用tomcat的session,而是重新实现了一套。所以系统一旦引入shiro后,采用传统的tomcat session共享机制是无效的,必须采用面向shiro 的session共享。 网上针对“shiro session共享”的文章比较多,...
为实现Web应用的分布式集群部署,要解决登录session的统一。本文利用shiro做权限控制,redis做session存储,结合spring boot快速配置实现session共享。
Shiro 提供了多种方式来获取当前用户的登录状态,其中一种常用的方式是通过Session来获取。 ##### 2.1 检查登录状态代码示例 ```java public boolean isAuthenticated(String sessionID, HttpServletRequest ...
将SpringBoot、Shiro和Redis整合,主要目的是利用Shiro进行用户认证和授权,而Redis作为Session的共享存储,解决分布式环境下的会话一致性问题。以下是整合步骤: 1. **引入依赖**:在SpringBoot的pom.xml文件中...
在分布式系统或微服务架构中,会话管理成为一个关键问题,因为默认情况下,Shiro的session管理是基于单个服务器的,无法在多台服务器之间共享用户会话信息。 在传统的Web应用中,session信息通常存储在服务器的内存...
2,新增CustomToken,重写UsernamePasswordToken免密登录调用方法和密码登录调用方法都在里面。 3,新增MyRetryLimitCredentialsMatcher,重写HashedCredentialsMatcher,主要是判定登录是否是免密登录。 4,新增...
在"shiro管理多登录入口配置,手机端登录与网页端登录"这个场景下,我们需要考虑如何为不同的登录入口(手机端和网页端)设置独立的验证流程。 首先,Shiro 的核心组件 Realm 负责与应用数据源交互,验证用户身份。...
如:A,B两个服务,在浏览器中登录访问A后,当前打开的浏览器上在开一个选项卡访问B服务后,回过来点击访问A时session丢失,需要重新登录A才可以访问。经过资料查找,发现问题是因为:IP相同认为是同一个域,接收了B...
通过以上步骤,我们便能成功地利用Spring、Shiro、Spring Data Redis和Spring Session Data Redis实现单点登录功能。这个解决方案不仅提供了便捷的用户体验,还降低了系统复杂性,提高了安全性。在实际开发中,可以...
直接使用java -jar srping....war命令运行即可 执行之后,访问http://主机的IP:8888/admin/*或者http://主机的IP:8888/login