Shiro开启Cache后无法进行不同用户的realm信息缓存

4,853次阅读
16条评论

前言

目前博主手上有在写一个权限方面的项目(watchdog-framework),项目基于Shiro进行了权限验证,不过开启了Cache之后,不同的用户登录之后其权限都和第一个登录者缓存的权限一样,这样肯定是行不通的,无法达到权限的期望效果,于是就开启了一番探索之旅。 Shiro开启Cache后无法进行不同用户的realm信息缓存

正文

首先第一个想到的就是缓存的原因,因为我使用了Redis缓存,所以直接在管理工具里面查看,发现不管登录多少个用户,用户realm信息缓存都只是会缓存一条,在ShiroConfig中每个Bean都检查了一遍,也没有找到原因,最终把问题源头锁定在自定义的MyRealm中,然后在重写的doGetAuthenticationInfo方法中打了断点,发现在执行后返回的SimpleAuthenticationInfo对象中的第三个参数的值,即为realmName,其值和redis里面缓存的唯一一条realm的名称一样,看到这里貌似找到了问题的真正所在之处,于是就将返回语句中的realmName参数值变成如下的格式:

String name = Encrypt.md5(user.getId()+user.getUsername());
return new SimpleAuthenticationInfo(user,user.getPassword(),name);

然后再执行一次登录操作,果然达到期望的目标了: Shiro开启Cache后无法进行不同用户的realm信息缓存

后记

在遇到问题只有通过不断的分析调试,才可以找到最终的问题的所在之处,愿世上没有解决不了的BUG!!!

4
憧憬Licoy
版权声明:本站原创文章,由憧憬Licoy于2018年04月25日发表,共计1359字。
转载提示:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(16条评论)
Loading...
sunshine 评论达人LV.1
2018-07-06 09:11:18 回复

大佬,问个问题,我用你的方法试了,完全没问题,但是实际情况是这样的,这里的不同用户在登陆时候,用的都是同一个浏览器,如果同一个浏览器进行登陆后,后面登陆的用户会把前面登陆的用户的权限给覆盖掉,请问该怎么处理?同一个浏览器下登陆不同的用户,cookie是一样的..

    憧憬Licoy 博主
    2018-07-06 09:13:16 回复

    @sunshine 你这个问题就存在一些问题,既然上个用户已经登出,为什么还要在浏览器端保存上个用户的相关身份信息在浏览器端呢?

      sunshine 评论达人LV.1
      2018-07-06 09:25:41 回复

      @憧憬Licoy 几个用户同时在线,同时用同一个浏览器,只是用不同的页签,且没有登出用户,这样会有权限冲突..

sunshine 评论达人LV.1
2018-07-05 09:19:27 回复

谢谢,用处大大滴

sunshine 评论达人LV.1
2018-07-05 09:18:36 回复

谢谢楼主坑了一个月的问题总算找到a答案了

haoessays 评论达人LV.1
2018-06-01 22:40:26 回复

收藏了,赞赞

皮皮虾 评论达人LV.1
2018-05-03 01:46:41 回复

请问您文章下面的赞和打赏的是用的插件还是自己写的,以及您网站没有登陆,文章发表吗

    憧憬Licoy 博主
    2018-05-03 08:51:00 回复

    @皮皮虾 是使用的张戈博主分享的文章弄得,因属于个人博客,网站没有开放登录。

网站建设 评论达人LV.2
2018-05-02 11:19:48 回复

喜欢这句“没有解决不了的BUG”

周松松博客 评论达人LV.1
2018-04-28 15:40:28 回复

此文很实用!