若依shiro非前后端分离项目集群化改造
文章目录
- 前言
- 一、若依shiro框架登录流程概述
- 1.登录入口
- 2.UserRealm下的登录认证方法
- 3.ShiroConfig配置说明
- 4.OnlineSessionDAO类
- 二、开始改造
- 1.导入依赖
- 2.yml加入配置,让redis来接管session
- 3.重构OnlineSessionDAO类(核心)
- 4.ShiroService新增方法通过会话序号删除信息
- 5.ShiroConfig下配置RedisManager
- 6.项目启动
- 7.nginx集群配置
- 8.结果验证
前言
若依前后端不分离基础项目,使用shiro框架作为授权和认证的安全框架。对比前后端分离项目的token验证机制,不分离项目仍然采用的是cookie + session的组合,浏览器存储的cookie与服务端的session进行校验。
项目集群方案,前后端分离项目有着天然的优势,前后端不分离项目就要考虑session共享的问题了。因为session机制对于单机应用是没问题的,在集群环境下,当请求被分配到另一台服务器时,新的服务器无法通过浏览器传入的cookie值取到session,这样登录状态就会验证失败。以若依shiro前后端不分离项目为例,核心是通过redis进行session共享来解决。
一、若依shiro框架登录流程概述
先梳理明白登录认证的流程,了解shiro安全认证的机制,才好改造,不然流程都糊里糊涂的,肯定会有一大堆问题。
1.登录入口
2.UserRealm下的登录认证方法
3.ShiroConfig配置说明
安全管理器
会话管理器
最后,Shiro过滤器配置没什么说的
4.OnlineSessionDAO类
存储会话session信息,继承自org.apache.shiro.session.mgt.eis包下的EnterpriseCacheSessionDAO类,并重写doReadSession(获取会话)、doDelete(会话停止时删除会话)方法。
二、开始改造
基本登录流程梳理清楚之后,就要开始着手改造了。
1.导入依赖
pom文件中导入spring-session-data-redis和shiro-redis的依赖
另外,spring-boot-devtools热部署的依赖需要注释掉,不然会报OnlineSession转换失败的错误
2.yml加入配置,让redis来接管session
3.重构OnlineSessionDAO类(核心)
原来继承自org.apache.shiro.session.mgt.eis包下的EnterpriseCacheSessionDAO类,现在改为继承org.crazycake.shiro包下的RedisSessionDAO类,并且重写update、delete、doCreate、doReadSession方法,如下:
public class OnlineSessionDAO extends RedisSessionDAO
{/*** 同步session到数据库的周期 单位为毫秒(默认1分钟)*/@Value("${shiro.session.dbSyncPeriod}")private int dbSyncPeriod;/*** 上次同步数据库的时间戳*/private static final String LAST_SYNC_DB_TIMESTAMP = OnlineSessionDAO.class.getName() + "LAST_SYNC_DB_TIMESTAMP";/*** SESSION 超时时间*/public static final int SESSION_TIME_OUT = 8 * 60 * 60;/*** SESSION会话*/public final static String CACHE_SESSION = "CACHE:SESSION:";private RedisSerializer valueSerializer = new ObjectSerializer();@Autowiredprivate SysShiroService sysShiroService;@Autowiredprivate StringRedisTemplate redisTemplate;public OnlineSessionDAO()