spring security登录成功后通过Principal获取名返回空问题
spring security登录成功通过Principal获取名返回空
如上图:
前端登录后获取用户信息,principal 返回空值,经历种种排查发现,前端请求后端,请求头没有加 bearer
按上图配置问题解决
spring security principal credentials authorities details authenticated
spring security在进行认证时,会将用户名和密码封装成一个Authentication对象,在进行认证后,会将Authentication的权限等信息填充完全返回。
Authentication会被存在SecurityContext中,供应用之后的授权等操作使用。
此处介绍下Authentication,Authentication存储的就是访问应用的用户的一些信息。
下面是Authentication源码
public interface Authentication extends Principal, Serializable { //用户的权限集合 Collection<? extends GrantedAuthority> getAuthorities(); //用户登录的凭证,一般指的就是密码 Object getCredentials(); //用户的一些额外的详细信息,一般不用 Object getDetails(); //这里认为Principal就为登录的用户 Object getPrincipal(); //是否已经被认证了 boolean isAuthenticated(); //设置认证的状态 void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException; }
讲解了Authentication后,我们回过头来再看attemptAuthentication方法,该方法会调用AuthenticationManager的authenticate方法进行认证并返回一个填充完整的Authentication对象。
在这里我们又要讲解一下认证的几个核心的类,很重要!
- a). AuthenticationManager
- b).ProviderManager
- c).AuthenticationProvider
- d).UserDetailsService
- e).UserDetails
来说一下这几个类的作用以及关联关系
- a). AuthenticationManager是一个接口,提供了authenticate方法用于认证。
- b). AuthenticationManager有一个默认的实现ProviderManager,其实现了authenticate方法。
- c). ProviderManager内部维护了一个存有AuthenticationProvider的集合,ProviderManager实现的authenticate方法再调用这些AuthenticationProvider的authenticate方法去认证,表单提交默认用的AuthenticationProvider实现是DaoAuthenticationProvider。
- d). AuthenticationProvider中维护了UserDetailsService,我们使用内存中的用户,默认的实现是InMemoryUserDetailsManager。UserDetailsService用来查询用户的详细信息,该详细信息就是UserDetails。UserDetails的默认实现是User。查询出来UserDetails后再对用户输入的密码进行校验。校验成功则将UserDetails中的信息填充进Authentication中返回。校验失败则提醒用户密码错误。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
简单几步实现将Spring security4.x升级到5.x
这篇文章主要介绍了简单几步实现将Spring security4.x升级到5.x方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-08-08SpringMVC架构的项目 js,css等静态文件导入有问题的解决方法
下面小编就为大家带来一篇SpringMVC架构的项目 js,css等静态文件导入有问题的解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-10-10Spring框架JdbcTemplate数据库事务管理完全注解方式
这篇文章主要介绍了Spring框架JdbcTemplate数据库事务管理及完全注解方式,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-05-05java客户端Etcd官方仓库jetcd中KeepAlive接口实现
这篇文章主要为大家介绍了java客户端Etcd官方仓库jetcd中KeepAlive接口实现,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,多多加薪2022-02-02springboot mybatis里localdatetime序列化问题的解决
这篇文章主要介绍了springboot mybatis里localdatetime序列化问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-10-10
最新评论