diff --git a/spring/Spring Security/Spring Security.md b/spring/Spring Security/Spring Security.md index 738c083..ab49cdd 100644 --- a/spring/Spring Security/Spring Security.md +++ b/spring/Spring Security/Spring Security.md @@ -335,5 +335,29 @@ UserDetailsManager users(DataSource dataSource) { } ``` ### UserDetails -UserDetails是通过UserDetailsService返回的。DaoAuthenticationProvider对UserrDetails进行验证并且返回 +UserDetails是通过UserDetailsService返回的。DaoAuthenticationProvider对UserrDetails进行验证并且返回Authentication. + +### UserDetailsService +UserDetailsService被DaoAuthenticationProvider调用,用来获取username、password和其他随着password/username一起认证的信息。对于UserDetailsService,Spring Security提供了in-memory和jdbc两种实现形式。 +可以通过自定义UserDetailsService类bean对象的方式来自定义认证过程。 +```java +// 自定义UserDetailsService的bean对象 +@Bean +CustomUserDetailsService customUserDetailsService() { + return new CustomUserDetailsService(); +} +``` + +### PasswordEncoder +Spring Security支持PasswordEncoder来安全的存储密码。可以通过自定义PasswordEncoder类的bean对象的形式来自定义Spring Security安全存储密码的过程。 + +### DaoAuthenticationProvider +DaoAuthenticationProvider是AuthenticationProvider的一个实现类,通过调用UserDetailsService和PasswordEncoder来认证用户名和密码。 +Spring Security中DaoAuthenticationProvider的工作流程: +1. authentication filter会读取username和password并且将其封装到UsernamePasswordAuthenticationToken中传递给AuthenticationManager,ProviderManager实现了AuthenticationManager +2. ProviderManager被配置为使用DaoAuthenticationProvider +3. DaoAuthenticationProvider通过UserDetailsService来查找UserDetails +4. DaoAuthenticationProvider通过PasswordEncoder来验证UserDetails中的密码 +5. 当验证成功时,会返回UsernamePasswordAuthenticationToken类型的Authentication,并且返回的Authentication拥有一个主体为UserDetailsService返回的UserDetails +6. 返回的UsernamePasswordAuthenticationToken会在SecurityContextHolder中保存