SecurityUtils.getSubject().getPrincipal()为null的问题怎么解决(云服务器、云主机、高防IP、高防服务器、香港服务器、美国服务器,开发技术)

时间:2024-04-30 02:40:16 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

    SecurityUtils.getSubject%28%29.getPrincipal%28%29%E4%B8%BAnull%E7%9A%84%E9%97%AE%E9%A2%98%E6%80%8E%E4%B9%88%E8%A7%A3%E5%86%B3

我在项目中获取getUserId(),和getUserName()获取不到值。

他们都是通过SecurityUtils.getSubject().getPrincipal()去获取的。

反复测试发现原因是 :在shiroConfig里面:

该方法,注意(是该接口名)被写为anon,不通过验证,即:

这种写法是为了postman测试时不被拦截。

从页面访问后端不需要anon了。

anon是不做拦截,authc是走自定义拦截

oauth3是自带拦截

修改为:

1.总的来说,SecurityUtils.getSubject()是每个请求创建一个Subject, 并保存到ThreadContext的resources(ThreadLocal<Map<Object, Object>>)变量中,也就是一个http请求一个subject,并绑定到当前过程。

问题来了:.subject.login()登陆认证成功后,下一次请求如何知道是那个用户的请求呢?

友情提示:本文唯一可以读一下的就是分析这个疑问,如果你已经明白就不用往下看了。

首先给出内部原理:1个请求1个Subject原理:由于ShiroFilterFactoryBean本质是个AbstractShiroFilter过滤器,所以每次请求都会执行doFilterInternal里面的createSubject方法。

猜想:因为subject是绑定到当前线程,这肯定需要一个中介存储状态

subject登陆成功后,下一次请求如何知道是那个用户的请求呢?

经过源码分析,核心实现如下DefaultSecurityManager类中:

每次请求都会重新设置Session和Principals,看到这里大概就能猜到:如果是web工程,直接从web容器获取httpSession,然后再从httpSession获取Principals,本质就是从cookie获取用户信息,然后每次都设置Principal,这样就知道是哪个用户的请求,并只得到这个用户有没有人认证成功,--本质:依赖于浏览器的cookie来维护session的

扩展,如果不是web容器的app,如何实现实现无状态的会话

1.一般的作法会在header中带有一个token,或者是在参数中,后台根据这个token来进行校验这个用户的身份,但是这个时候,servlet中的session就无法保存,我们在这个时候,就要实现自己的会话创建,普通的作法就是重写session与request的接口,然后在过滤器在把它替换成自己的request,所以得到的session也是自己的session,然后根据token来创建和维护会话

2.shiro实现:

重写shiro的sessionManage

本文:SecurityUtils.getSubject().getPrincipal()为null的问题怎么解决的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:MySQL Replication中并行复制怎么实现下一篇:

64 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18