SecurityUtils.getSubject().getPrincipal()为null的问题怎么解决


本篇内容主要讲解“SecurityUtils.getSubject().getPrincipal()为null的问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SecurityUtils.getSubject().getPrincipal()为null的问题怎么解决”吧!我在项目中获取getUserId(),和getUserName()获取不到值。他们都是通过SecurityUtils.getSubject().getPrincipal()去获取的。反复测试发现原因是 :在shiroConfig里面:该方法,注意(是该接口名)被写为anon,不通过验证,即:这种写法是为了postman测试时不被拦截。从页面访问后端不需要anon了。anon是不做拦截,authc是走自定义拦截oauth3是自带拦截修改为:1.总的来说,SecurityUtils.getSubject()是每个请求创建一个Subject, 并保存到ThreadContext的resources(ThreadLocal

>)变量中,也就是一个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的问题怎么解决”有了更深的了解,不妨来实际操作一番吧!这里是百云主机网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

相关推荐: vue定义全局的方法是什么

本篇内容介绍了“vue定义全局的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.利用全局混入mixin定义全局方法Vue.mixin(mixin)n…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 03/17 13:22
下一篇 03/17 13:22

相关推荐