这篇文章主要讲解了“Spring如何配置自定义的用户存储”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring如何配置自定义的用户存储”吧!通过查看AuthenticationManagerBuilder的源码可以发现里面还有一个方法 userDetailsService(),允许我们自定义用户存储的实现.如下
*Thismethodalsoensurethatthe{@linkUserDetailsService}isavailableforthe
*{@link#getDefaultUserDetailsService()}method.Notethatadditional
*{@linkUserDetailsService}’smayoverridethis{@linkUserDetailsService}asthe
*default.
*我们发现 此方法接收一个 UserDetailsService 的实现类.我们可以再点进去查看一下 UserDetailsService 的源码,如下:
*ItisusedthroughouttheframeworkasauserDAOandisthestrategyusedbythe
*{@linkorg.springframework.security.authentication.dao.DaoAuthenticationProvider
*DaoAuthenticationProvider}.
*
*
*Theinterfacerequiresonlyoneread-onlymethod,whichsimplifiessupportfornew
*data-accessstrategies.
*
*@seeorg.springframework.security.authentication.dao.DaoAuthenticationProvider
*@seeUserDetails
*
*@author
publicinterfaceUserDetailsService
//~Methods
//========================================================================================================
/**
*Locatestheuserbasedontheusername.Intheactualimplementation,thesearch
*maypossiblybecasesensitive,orcaseinsensitivedependingonhowthe
*implementationinstanceisconfigured.Inthiscase,theUserDetails
*objectthatcomesbackmayhaveausernamethatisofadifferentcasethanwhat
*wasactuallyrequested..
*
*@paramusernametheusernameidentifyingtheuserwhosedataisrequired.
*
*@returnafullypopulateduserrecord(nevernull
)
*
*@throws
UserDetailsloadUserByUsername(Stringusername)throws发现这是一个接口,并且只有一个方法 loadUserByUsername(),我们所需要做的就是实现loadUserByUsername()方法,根据给定的用户名来查找用户。
loadUserByUsername()方法会返回代表给定用户的UserDetails对象.而这个UserDetail 又是个什么呢?我们再次产看其源码,如下:
*ImplementationsarenotuseddirectlybySpringSecurityforsecuritypurposes.They
*simplystoreuserinformationwhichislaterencapsulatedinto{@linkAuthentication}
*objects.Thisallowsnon-securityrelateduserinformation(suchasemailaddresses,
*telephonenumbersetc)tobestoredinaconvenientlocation.
*
*Concreteimplementationsmusttakeparticularcaretoensurethenon-nullcontract
*detailedforeachmethodisenforced.See
*{@linkorg.springframework.security.core.userdetails.User}forareference
*implementation(whichyoumightliketoextendoruseinyourcode).
*
*@seeUserDetailsService
*@seeUserCache
*
*@author
publicinterfaceUserDetailsextendsSerializable
//~Methods
//========================================================================================================
/**
*Returnstheauthoritiesgrantedtotheuser.Cannotreturnnull
.
*
*@return
CollectionextendsGrantedAuthority>getAuthorities();
/**
*Returnsthepasswordusedtoauthenticatetheuser.
*
*@return
StringgetPassword();
/**
*Returnstheusernameusedtoauthenticatetheuser.Cannotreturnnull
*.
*
*@return
StringgetUsername();
/**
*Indicateswhethertheuser’saccounthasexpired.Anexpiredaccountcannotbe
*authenticated.
*
*@return
booleanisAccountNonExpired();
/**
*Indicateswhethertheuserislockedorunlocked.Alockedusercannotbe
*authenticated.
*
*@return
booleanisAccountNonLocked();
/**
*Indicateswhethertheuser’scredentials(password)hasexpired.Expired
*credentialspreventauthentication.
*
*@return
booleanisCredentialsNonExpired();
/**
*Indicateswhethertheuserisenabledordis免费云主机域名abled.Adisabledusercannotbe
*authenticated.
*
*@return
boolean发现这也是一个接口,也就是说我们还要实现这个 UserDetail接口.这个结构封装了用户的登陆信息.好了,了解了 userDetailsService 方法的构造,我们就可以着手写代码了.首先定义一个 MyUserService 实现 UserDetailsService 接口.并在重写的 loadUserByUsername 方法中返回 UserDetail类型的对象即可,
代码如下:可以看到我们最后返回了一个 UserEntity 对象,这个类是我们自定义的 对UserDetail接口的实现类,代码如下:为什么我们要这样写呢,其实莫慌,我们如果不像自己实现 UserDetails 接口,Spring Security 已经为我们实现好了.我们来到 UserDetails接口,
把鼠标放到 UserDetails 上,在idea下按 ctrl+h ,我们就可以看到这个接口的实现类,如图:除了我们自定义的UserEntity外,还有一个 User,其实这就是Spring Security为我们实现好的 UserDetails 类.我们可以看到它的源码如下:由于源码太长,这里只贴出一部分,可以看到这里面也有我们在UserEntity定义的字段.其实也不奇怪了,本来我们的 UserEntity 就是按着User进行改造的嘛.之所以自定义UserEntity,这里是为了方面初学者进行快速入门,相比于User我们的UserEntity还是很简单的.现在 我们的 UserDetailsService 已经完成了,接下来就是在 SecurityConfig 的configure方法中使用了,如下:怎么样是不是很简单.最后进行测试,运行项目,访问: http://localhost/hello ,会跳转到 http://localhost/login 让我们登陆,我们是输入 用户名 itguang 和密码 123456点击登录,就会看到浏览器返回一个 hello Spring Security
,说明我们自定义用户存储已经完美实现.感谢各位的阅读,以上就是“Spring如何配置自定义的用户存储”的内容了,经过本文的学习后,相信大家对Spring如何配置自定义的用户存储这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是百云主机,小编将为大家推送更多相关知识点的文章,欢迎关注!
这篇文章主要介绍“C++如何实现二分法”,在日常操作中,相信很多人在C++如何实现二分法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++如何实现二分法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!二分法是在一个排好序的序…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。