Shiro会话管理和加密
会话管理
Shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如Tomcat),不管是J2SE还是J2EE环境都可以使用,提供了会话管理,会话事件监听,会话存储/持久化,容器无关的集群,失效/过期支持,对Web的透明支持,SSO单点登录的支持等特性
会话相关APL
- Subject.getSession():获取会话,等价于Subject.getSession(true),即如果当前没有创建session对象会创建一个;Subject.getSession(false),如果当前没有创建session对象则返回null.
- session.setAttribute(key,val):设置会话属性
- session.getAttribute(key):获取会话属性
- session.removeAttribute(key):删除会话属性
SessionDAO
Shiro提供SessionDAO用于会话持久化.提供CRUD操作
在实际开发中,如果要用到SessionDAO组件,可以自定义类实现自EnterpriseCacheSessionDAO类,为其注入sessionIdGenerator属性,如果用到缓存的话还可以注入一个缓存的实现,然后将这个SessionDAO组件注入给SessionManager(会话管理器),最后将SessionManager配置给SecurityManager。
缓存
使用Shiro-redis集成redis缓存
1.首先添加依赖
<dependency>
<groupId>org.crazycake</groupId>
<artifactId>shiro-redis</artifactId>
<version>3.1.0</version>
</dependency>
application.properties配置文件中添加Redis配置
# Redis 数据库索引(默认为0)
spring.redis.database=8
# Redis 服务器地址
spring.redis.host=localhost
# Redis服务器连接端口
spring.redis.port=6379
# Redis 服务器连接密码(默认为空)
spring.redis.password=root
#连接池最大连接数(使用负值表示没有限制) 默认8
spring.redis.lettuce.pool.max-active=8
#连接池最大阻塞等待时间(使用负值表示没有限制)默认 -1
spring.redis.lettuce。pool.max-wait=-1
#连接池中的最大空闲连接默认8
spring.redis.lettuce.pool.max-idle=8
#连接池中的最小空闲连接默认0
spring.redis.lettuce.pool.min-idle=0
#redis服务器超时时间
spring.redis.timeout=5000
编写ShiroConfig类
- 注入Rrdis参数:@Value注解从application.properties配置文件中获取
- 添加redisManager():创建RedisManager
- 添加cacheManager():创建RedisCacheManager,注入RedisManager
- 添加redisSessionDao():创建RedisSessionDAO,注入RedusSessionDAO
- 修改myShiroRealm():创建MyShiroRealm,启用缓存
- 修改securityManager():创建SecurityManager,注入MyShiroRealm,RedisCacheManager、SessionManager
package com.lei.demo.config.shiro;
import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
import com.lei.demo.pojo.SysRight;
import com.lei.demo.servic.RoleService;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.crazycake.shiro.RedisCacheManager;
import org.crazycake.shiro.RedisManager;
import org.crazycake.shiro.RedisSessionDAO;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context