21

我正在学习Spring Security,我有几个简单的问题尊重UserDetailsService

1-何时loadUserByUsername实际调用或调用?认证后?每次登录只有一次?

2-登录后,Spring会将实际登录的用户放入httpSession吗?

3- 推荐的填充集合的方法<GrantedAuthority>UserDetails什么?

  1. Eagle 获取它们,因此当调用 loadUserByUsername 时,返回的用户已经拥有它的“ROLES”
  2. UsernamePasswordAuthenticationFilter成功登录后实现另一个自定义过滤器,如填充?
  3. 以上都不是……</li>
4

1 回答 1

16
  1. 它通常由AuthenticationProvider实例调用以对用户进行身份验证。例如,当提交用户名和密码时,UserdetailsService会调用 a 来查找该用户的密码以查看其是否正确。它通常还会提供有关用户的一些其他信息,例如权限和您可能希望为登录用户访问的任何自定义字段(例如电子邮件)。这是主要的使用模式。您可以对代码进行 grep 以查看它的确切调用位置。

手册中所述

关于 UserDetailsS​​ervice 经常有一些混淆。它纯粹是用户数据的 DAO,除了将数据提供给框架内的其他组件外,不执行任何其他功能。特别是,它不对用户进行身份验证,这是由 AuthenticationManager 完成的。在许多情况下,如果您需要自定义身份验证过程,直接实现 AuthenticationProvider 会更有意义。

  1. 是的。一旦用户通过身份验证,一个SecurityContext实例就会存储在会话中。

  2. 如果您需要实现自定义UserDetailsService,那么它将取决于您的要求以及它们的存储方式。通常,您会在加载其他用户信息的同时加载它们。这不是您在过滤器中可能会做的事情。正如上面手册中的引用所解释的,如果您实际上正在实施不同的身份验证机制,那么您应该AuthenticationProvider直接实施。在您的应用程序中有一个不是强制性的UserDetailsService。您可以将其视为某些内置功能使用的策略。

于 2012-06-01T19:21:34.747 回答