若依shiro非前后端分离项目集群化改造

前言

        若依前后端不分离基础项目,使用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();

    @Autowired
    private SysShiroService sysShiroService;

    @Autowired
    private StringRedisTemplate redisTemplate;

    public OnlineSessionDAO()
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值