SecurityUtils.getSubject().getPrincipal()为null的问题怎么解决
导读:本文共6112字符,通常情况下阅读需要20分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: SecurityUtils.getSubject().getPrincipal()为null我在项目中获取getUserId(),和getUserName()获取不到值。他们都是通过SecurityUtils.getSubject().getPrincipal()去获取的。反复测试发现原因是 :在shiroConfig里面:该方法,注意(是该接口名)被写为ano... ...
目录
(为您整理了一些要点),点击可以直达。我在项目中获取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的问题怎么解决的详细内容,希望对您有所帮助,信息来源于网络。