什么时候调用loadUserByUsername?(春季安全)

Yic*_*aoz 15 java spring spring-security

我正在学习Spring Security,我很少有问题UserDetailsService:

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

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

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

  1. Eagle会在调用loadUserByUsername时获取它们,返回的用户已经拥有它的"ROLES"
  2. UsernamePasswordAuthenticationFilter成功登录后实现另一个自定义过滤器,如populate?
  3. 以上都不是......

Sha*_*eep 12

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

手册所述:

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

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

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

  • 卢克,别误会我的意思.我喜欢Spring并一直使用它.我100%同意你的看法.由于负责关键任务系统,我非常重视代码更改.我的评论特别针对UserDetails和UserDetailsS​​ervice.例如,可以在层次结构中添加AbstractDaoAuthenticationProvider,以便为不想使用UserDetails和UserDetailsS​​ervice的开发人员提供扩展点.目前,专用名称被赋予抽象类AbstractUserDetailsAuthenticationProvider,并且通用名称被赋予其子类DaoAuthenticationProvider. (2认同)