我正在学习Spring Security
,我很少有问题UserDetailsService
:
1-实际调用或调用loadUserByUsername
时?认证后?每次登录只需一次?
2-登录后,Spring会将实际登录的用户放入httpSession吗?
3-建议填充<GrantedAuthority>
UserDetails
的集合的建议方法是什么?
UsernamePasswordAuthenticationFilter
填充?答案 0 :(得分:12)
AuthenticationProvider
实例调用,以便对用户进行身份验证。例如,当提交用户名和密码时,会调用UserdetailsService
来查找该用户的密码以查看其是否正确。它还通常会提供有关用户的一些其他信息,例如您可能要为登录用户访问的权限和任何自定义字段(例如,电子邮件)。这是主要的使用模式。您可以grep代码以查看它的确切位置。如the manual中所述:
UserDetailsService经常存在一些混淆。它纯粹是用户数据的DAO,除了将数据提供给框架内的其他组件之外,不执行任何其他功能。特别是,它不会对用户进行身份验证,这是由AuthenticationManager完成的。在许多情况下,如果您需要自定义身份验证过程,则直接实现AuthenticationProvider会更有意义。
是。用户通过身份验证后,SecurityContext
实例为stored in the session。
如果您需要实施自定义UserDetailsService
,那么它将取决于您的要求及其存储方式。通常,您将与其他用户信息同时加载它们。这不是你可能在过滤器中做的事情。如上面手册中的引文所述,如果您实际实现了不同的身份验证机制,那么您应该直接实现AuthenticationProvider
。您的应用中不必强制UserDetailsService
。您可以将其视为某些内置功能使用的策略。