shiro学习29-实现rememberMe功能-RememberMeManager

本文详细介绍了Shiro框架中RememberMe功能的实现,包括RememberMeManager接口、AbstractRememberMeManager类及其子类CookieRememberMeManager的工作原理。讨论了序列化、加密服务以及如何在登录成功和失败时处理RememberMe的cookie。同时,阐述了如何在用户未登录时从cookie中获取principal并创建subject的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个接口是用来实现rememberme的功能的。他的实现类为AbstractRememberMeManager,是一个抽象类,最终的继承类为cookieRememberMeManager,即将信息发送到cookie中。

先看一下defaultWebSecurityManager的构造方法:

 

public DefaultWebSecurityManager() {
        super();
        ((DefaultSubjectDAO) this.subjectDAO).setSessionStorageEvaluator(new DefaultWebSessionStorageEvaluator());
        this.sessionMode = HTTP_SESSION_MODE;
        setSubjectFactory(new DefaultWebSubjectFactory());
        setRememberMeManager(new CookieRememberMeManager());//初始化一个cookieRememberMeManager。
        setSessionManager(new ServletContainerSessionManager());
 }

 

 

 

我们从AbstractRememberMeManager的源码开始看。

这个类中有两个重要的属性:

1Serializer<PrincipalCollection> serializer; //用来将subjectprincipalCollection转化为byte[] 数组的。使用的实现类是DefaultSerializer,里面的逻辑是使用标准的jvm序列化方式来实现的。

2、CipherService cipherService;这个属性用来将序列化的字符串数组进行加密的,我们简单的看一下他的javadoc:他通过一种加密方法(Cipher)将输入的值转化为一个不可读的模式(加密),但是这个转化过程必须使用一个key。这个转化过程是可逆的,但是在逆转化(解密)的时候必须也要知道这个key才可以。CipherService类可以实现加密和解密两个功能。

Cipher分为对称加密和非对称加密,对称加密指的是对于加密和解密的key是一样的,非对称加密是指加密和解密的key是不一样的。(对于这些个加密算法我也没有研究)

因为我们最终使用的CipherServiceAesCipherService,他是一个对称加密的,所以使用的key只有一个,在AbstractRememberMeManager中统一使用byte[] DEFAULT_CIPHER_KEY_BYTES = Base64.decode("kPH+bIxk5D2deZiIxcaaaA==");作为加密和解密的key

在构造方法有一个方法:setCipherKey,就是将byte[]设置为encryptionCipherKeydecryptionCipherKey。所以这样就可能早成一个问题,我们的最终实现是将pricipalCollection作为cookievalue发送到cookie中取得,如果有人知道我们使用的是shiro,并且知道我们使用的是对称的AesCipherService进行对称加密解密并且使用的keyBase64.decode("kPH+bIxk5D2deZiIxcaaaA=="),那么就可以通过解密来获得之前设置的principalCollection,在AbstracRememberMeManagerjavadoc中也提及了,如果我们的principalCollection

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值