shiro:每次页面request,SecurityUtils.getSubject() 返回不同的值

发布于 2022-01-01 08:49:06 字数 1140 浏览 519 评论 16

@eyelee 你好,想跟你请教个问题:

jfinal整合shiro,shiro权限的使用中,每次页面request,SecurityUtils.getSubject() 得到的subject 不一样,

SecurityUtils.java
    public static Subject getSubject() {
        Subject subject = ThreadContext.getSubject();
        if (subject == null) {
            subject = (new Subject.Builder()).buildSubject();
            ThreadContext.bind(subject);
        }
        return subject;
    }


ThreadContext.java
    public static final String SUBJECT_KEY = ThreadContext.class.getName() + "_SUBJECT_KEY";
    public static Subject getSubject() {
        return (Subject) get(SUBJECT_KEY);
    }

因为每次页面过来的request都会是一个不同的thread,所以 SUBJECT_KEY 不一样,得到subject不一样, 权限检测这样就出问题了,subject是按线程保持,shiro有自定义的subject可以线程共享,但仍没搞明白,如何同一用户取到一样的subject?谢谢~

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(16

归属感 2022-01-08 02:16:49

请教下:如果我需要在public void sessionDestroyed(HttpSessionEvent arg0)方法里获取Subject该如何弄呢?

在Controller里获取没问题,就是在HttpSessionListener里就取不到。

目前获取不到,总是Null

也尝试过org.apache.shiro.session.SessionListener实现会话监听,一直没弄成功,测试发现只有onStart被触发,onExpiration,onStop没动静,等等会话过期之后,刷新页面就获取不到会话数值导致出错

恋你朝朝暮暮 2022-01-08 02:16:46

我这个是官方文档给出的~~~

墨洒年华 2022-01-08 02:16:46

多个用户登录,每个用户拿到的subject,都是被最后一个用户给改写。。。加bind()改也是错的。。

丢了幸福的猪 2022-01-08 02:16:46

学习

乞讨 2022-01-08 02:16:46

经验学习

北笙凉宸 2022-01-08 02:16:44

啊,官方文档我看的不够仔细吧。谢谢~
@eyelee

飘然心甜 2022-01-08 02:02:35

Subject subject = ThreadContext.getSubject(); 这个试试~~

刘备忘录 2022-01-08 01:42:25

ThreadContext.bind(SecurityUtils.getSubject()); Subject suject = SecurityUtils.getSubject(); 可以得到同一个subject了。

女中豪杰 2022-01-07 23:47:40

引用来自“eyelee”的答案

ServletContext servletContext = ; 
WebEnvironment webEnv = WebUtils.getRequiredWebEnvironment(servletContext);
org.apache.shiro.mgt.SecurityManager sm = webEnv.getWebSecurityManager();
SecurityUtils.setSecurityManager(sm);
Subject subject = SecurityUtils.getSubject();
这样获取试试
终止放荡 2022-01-07 20:24:01

嗯,参考的,非常感谢
@JFinal
@玛雅牛

冷弦 2022-01-07 11:40:22

这段代码放在哪里?只是获取的地方用吗?只是获取的地方不行啊,还是拿到的不同,只有相同的线程id才能拿到,我已经崩溃了。。。

南汐寒笙箫 2022-01-07 07:50:38
ServletContext servletContext = ; 
WebEnvironment webEnv = WebUtils.getRequiredWebEnvironment(servletContext);
org.apache.shiro.mgt.SecurityManager sm = webEnv.getWebSecurityManager();
SecurityUtils.setSecurityManager(sm);
Subject subject = SecurityUtils.getSubject();
这样获取试试
陌上芳菲 2022-01-07 04:55:37

问题在这里。

清晨说ぺ晚安 2022-01-04 23:13:54

回复
我说我咋没碰到过呢,原来是顺序问题

甜扑 2022-01-04 18:53:35
<!-- shiro  --> 
<listener> 
<listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class> 
</listener> 
<filter> 
<filter-name>shiro</filter-name> 
<filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class> 
        <init-param> 
       <param-name>staticSecurityManagerEnabled</param-name> 
       <param-value>true</param-value> 
   </init-param> 
</filter> 
<filter-mapping> 
<filter-name>shiro</filter-name> 
<url-pattern>/*</url-pattern> 
</filter-mapping>

@andylive 这一段放在最上面,在JFinal 之前

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文