Shiro - Spring + Jedis(会话、缓存、自动登录)整合篇(上)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Shiro - Spring + Jedis(会话、缓存、自动登录)整合篇(上)

零、前言

Shiro - 基础篇


一、Shiro 集成 Spring

  1. Shiro集成Spring
  2. Shiro集成Spring-从数据库获取数据
  3. 通过注解配置授权
  4. Shiro过滤器

image.png



Shiro过滤器


内建过滤器:roles[a,b,c] 必须权限都符合才可以、perms[a,b,c]必须权限同时具备才可以。

anon 代表无需权限

authBasic:httpBasic

authc 代表需要认证才能访问

user 代表需要存在用户对象才能被访问

logout 登录退出才能被访问

perms 拥有权限才能被访问

roles 拥有角色才能被访问

ssl : 要求是安全的协议(不常用)

port 相应端口号才能访问(不常用)

自定义,分认证与授权,如果是认证则继承认证的类,如果是授权则继承授权的类。然后重写方法,其中参数Object o 即代表存在哪些参数,即perms[a,b,c]中的abc然后判断返回结果true 或者false即可。

在后台xml文件中引入该filter的bean,然后在主过滤器中引入filter的标签,写入entry key 与 value-ref,然后在filter过滤中

filterChainDefinitions地方按照之前的规则使用该自定义过滤,写入key值即可。



二、Shiro 会话管理


image.png


Shiro 会话管理


其会话管理主要涉及到了Shiro整体框架的SessionManager与SessionDao模块。


视频中讲的是与Redis相结合,进行对Session的增删改查操作。


当然Shiro管理Session还可以通过别的介质进行管理。


步骤如下:


先加载Redis,在Maven 的pom.xml文件中配置Redis依赖包,坐标如下:

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.7.3</version>
</dependency>


配置Spring与Redis结合的配置文件。新建立Spring-redis.xml文件。


由于之前也没接触过Redis,这里只能重复视频中的配置。配置JedisPool的bean,

其中设置属性jedisPoolConfig、host、port信息,其中JedisPoolConfig则需要另外建立bean,然后将此Bean引入到JedisPool中,host则写本机地址,port一般为6379.当然以上的类都是Redis包下的,Redis是依靠Jedis来实现其功能。然后将此文件导入到Spring.xml主文件中,即采用import标签。


注意:需要下载相应redis server,程序启动的时候,要先启动redis server,否则会报错。

新建util包,建立JedisUtil类,此类中主要是对Redis进行增删改查操作。因为Reids是存放键值对的形式。在JedisUtil中,将JedisPool注入到类中,写入单独方法获取Jedis,即通过JedisPool.getResource()来获取Jedis,此方法用于获取Jedis对象,通过Jedis进行直接对Redis存放值进行增删改查操作。

创建Shiro中SessionDao类,实现AbstractSessionDao,实现其中的增删改查、获取当前活跃的Session等方法。由于redis中存放的是key与value都是二进制的数组形式,所以在修改Redis值的时候需要注意将其转成二进制的数据,并且判断是否存在相应id、session等。

其中:

generateSessionId(session) 生成Serializable序列化的sessionId

assignSessionId(session,sessionId) 绑定session与相应的Id值

session.getId 返回的是SessionId值,同理也是Serializable的类型

SerializationUtils.serialize (session) 通过序列化将session转成相应的byte[]数组

SerializationUtils.deserialize(byte[]) 通过反序列化将字节转成Object类型,可通过强转获取Session对象

PS:注意session 与 sessionId是否为空的情况判断。另外如果加入前缀,可以在搜索的时候加入前缀+“*”代表搜索前缀是aa的所有匹配的key值。

同样JedisUtils中也需要通过Jedis 的get put expire del keys方法进行获取 存储 设置等待时间 删除操作、查询匹配key的值集合。

新建类SessionManager 继承 DefaultWebSessionManager类,里面可以什么都不做。

在spring.xml文件中,写入SessionManager的Bean 并且写入Sessiondao的bean,将SessionDao的Bean 注入到Sessionmanager中。最后将SessionManager的Bean注入到SecurityManager中即可。

此处在测试过程中,发现系统会读取Session多次。【需要重构第6点的DefaultWebSessionManager】

需要在SessionManager中重写,retrieveSession方法。


a、先通过参数SessionKey获取sessionId,然后判断sessionkey是否为websessionkey,如果是则通过强转将其转为WebSessionKey并且获取ServletRequest。


b、核心是将SessionId 与 Session 放到Reqeust中,如果Request有,则直接拿去,没有在去Redis中拿,如此一来则减少了访问Redis的次数,减轻了Reids 的压力。此时判断request是否为空以及sessionId是否为空,如果同时都不为,则通过sessionId 从request的属性中获取Session,在判断Session是否为空,如果不是空,则返回。


c、当不符合以上条件时候,直接调用父类的方法获取Session,继续判断request是否为空,如果不是空,则将session和sessionId放入到request的属性中即可,方便下次再来寻找直接从request中拿出,不用再多次访问Redis了。


目录
相关文章
|
18天前
|
存储 安全 Java
管理 Spring 微服务中的分布式会话
在微服务架构中,管理分布式会话是确保用户体验一致性和系统可扩展性的关键挑战。本文探讨了在 Spring 框架下实现分布式会话管理的多种方法,包括集中式会话存储和客户端会话存储(如 Cookie),并分析了它们的优缺点。同时,文章还涵盖了与分布式会话相关的安全考虑,如数据加密、令牌验证、安全 Cookie 政策以及服务间身份验证。此外,文中强调了分布式会话在提升系统可扩展性、增强可用性、实现数据一致性及优化资源利用方面的显著优势。通过合理选择会话管理策略,结合 Spring 提供的强大工具,开发人员可以在保证系统鲁棒性的同时,提供无缝的用户体验。
|
2月前
|
安全 Java 数据库
第16课:Spring Boot中集成 Shiro
第16课:Spring Boot中集成 Shiro
557 0
|
12天前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
188 4
|
21天前
|
存储 缓存 Java
Spring中@Cacheable、@CacheEvict以及其他缓存相关注解的实用介绍
缓存是提升应用性能的重要技术,Spring框架提供了丰富的缓存注解,如`@Cacheable`、`@CacheEvict`等,帮助开发者简化缓存管理。本文介绍了如何在Spring中配置缓存管理器,使用缓存注解优化数据访问,并探讨了缓存的最佳实践,以提升系统响应速度与可扩展性。
173 0
Spring中@Cacheable、@CacheEvict以及其他缓存相关注解的实用介绍
|
6月前
|
安全 Java Apache
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
325 0
|
6月前
|
安全 Java 数据安全/隐私保护
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
255 0
|
2月前
|
存储 缓存 NoSQL
Spring Cache缓存框架
Spring Cache是Spring体系下的标准化缓存框架,支持多种缓存(如Redis、EhCache、Caffeine),可独立或组合使用。其优势包括平滑迁移、注解与编程两种使用方式,以及高度解耦和灵活管理。通过动态代理实现缓存操作,适用于不同业务场景。
307 0
|
4月前
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
186 32
|
10月前
|
缓存 NoSQL Java
什么是缓存?如何在 Spring Boot 中使用缓存框架
什么是缓存?如何在 Spring Boot 中使用缓存框架
619 0
|
9月前
|
缓存 NoSQL Java
Spring Boot中的分布式缓存方案
Spring Boot提供了简便的方式来集成和使用分布式缓存。通过Redis和Memcached等缓存方案,可以显著提升应用的性能和扩展性。合理配置和优化缓存策略,可以有效避免常见的缓存问题,保证系统的稳定性和高效运行。
267 3