Shrio Unable to execute ‘doFinal‘ with cipher instance
生活随笔
收集整理的这篇文章主要介绍了
Shrio Unable to execute ‘doFinal‘ with cipher instance
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
今天项目启动后登录项目,突然爆出Unable to execute ‘doFinal’ with cipher instance错误。清除cookie登录测试,又不报错了,以前也见过类似问题,因为不影响使用,于是就忽略了,今天又遇到了,特研究一下。
原来,项目中使用Shiro作为认证权限控制框架,问题就出在RememberMe功能的配置上。问题产生的原因是rememberMe的cookie在第二次打开页面后shiro无法解密。
@Bean public RememberMeManager rememberMeManager() {CookieRememberMeManager rememberMeManager = new CookieRememberMeManager();//注入自定义cookie(主要是设置寿命, 默认的一年太长)SimpleCookie simpleCookie = new SimpleCookie("rememberMe");simpleCookie.setHttpOnly(true);//设置RememberMe的cookie有效期为7天simpleCookie.setMaxAge(604800);rememberMeManager.setCookie(simpleCookie); return rememberMeManager;}框架源码
public AbstractRememberMeManager() {this.serializer = new DefaultSerializer<PrincipalCollection>();AesCipherService cipherService = new AesCipherService();this.cipherService = cipherService;setCipherKey(cipherService.generateNewKey().getEncoded());}public void setCipherKey(byte[] cipherKey) {//Since this method should only be used in symmetric ciphers//(where the enc and dec keys are the same), set it on both:setEncryptionCipherKey(cipherKey);setDecryptionCipherKey(cipherKey);}rememberMeManager继承了AbstractRememberMeManager,然而AbstractRememberMeManager的构造方法中每次都会重新生成对称加密密钥,意味着每次重启程序都会重新生成一对加解密密钥。
这就会导致了,第一次启动程序shiro使用A密钥加密了cookie,第二次启动程序shiro重新生成了密钥B,当用户访问页面时,shiro会用密钥B去解密上一次用密钥A加密的cookie,导致解密失败,导致报错,所以这不影响用户登录操作(rememberMe失效罢了),所以这种异常只会在程序重启(shiro清除session)第一次打开页面的时候出现。
解决办法:手动设置对称加密秘钥。
//手动设置对称加密秘钥,防止重启系统后系统生成新的随机秘钥,防止导致客户端cookie无效 rememberMeManager.setCipherKey(Base64.decode("6ZmI6I2j3Y+R1aSn5BOlAA=="));文章转自
总结
以上是生活随笔为你收集整理的Shrio Unable to execute ‘doFinal‘ with cipher instance的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: B端页面——详细表单设计流程
- 下一篇: B端SaaS产品工作流程