企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[toc] ![architecture](https://box.kancloud.cn/bfd8826ca3acad751c3addb5ba555128_1024x768.png) ## 1.接收请求 Spring安全性有一系列/过滤器链。 因此,当请求到来时,它将通过一系列过滤器进行身份验证和授权。 当存在用户认证请求时,它也将像往常一样通过过滤器链,直到它根据认证机制/模型找到相关的认证过滤器。 例如: - HTTP基本身份验证请求通过过滤器链直到它到达BasicAuthenticationFilter。 HTTP摘要式身份验证请求通过过滤器链,直到它到达DigestAuthenticationFilter。 登录表单提交请求(登录表单身份验证请求)通过过滤器链直到它到达UsernamePasswordAuthenticationFilter。 x509身份验证请求通过过滤器链直到它到达X509AuthenticationFilter等... ## 2.根据用户凭据创建AuthenticationToken 一旦相关的AuthenticationFilter收到身份验证请求,它就会从收到的请求中提取用户名和密码(大多数身份验证机制都需要用户名和密码)。 之后,它会根据提取的用户凭据创建一个Authentication对象。 如果提取的凭据是用户名和密码,则将使用提取/找到的用户名和密码创建UsernamePasswordAuthenticationToken。 ## 3.创建的AuthenticationToken委派给AuthenticationManagager 创建UsernamePasswordAuthenticationToken对象后,它将用于调用AuthenticationManager的authenticate方法。 AuthenticationManager只是一个接口,实际的实现是ProviderManager。 ~~~ public interface AuthenticationManager { Authentication authenticate(Authentication authentication)throws AuthenticationException; } ~~~ ProviderManager有一个配置的AuthenticationProvider列表,应该用于验证用户请求。 ProviderManager将遍历每个提供的AuthenticationProvider,并尝试根据传递的Authentication Object对用户进行身份验证(例如: - UsernamePasswordAuthenticationToken) ## 4.尝试使用AuthenticationProvider列表进行身份验证 AuthenticationProvider尝试使用提供的身份验证对象对用户进行身份验证。 ~~~ public interface AuthenticationProvider { Authentication authenticate(Authentication authentication) throws AuthenticationException; boolean supports(Class<?> authentication); } ~~~ 以下是框架附带的一些现有身份验证程序: * CasAuthenticationProvider * JaasAuthenticationProvider * DaoAuthenticationProvider * OpenIDAuthenticationProvider * RememberMeAuthenticationProvider * LdapAuthenticationProvider ## 5.需要UserDetailsService吗 一些AuthenticationProvider可以使用UserDetailsService根据用户名检索用户详细信息。 (例如: - DaoAuthenticationProvider) ~~~ public interface UserDetailsService { UserDetails loadUserByUsername(String username) throws UsernameNotFoundException; } ~~~ ## 6和7. UserDetails 还是 User Object? UserDetailsService将根据用户名检索UserDetails(实际实现是User)。 ## 8.Authentication 对象 还是 AuthenticationException? 如果用户成功通过身份验证,则将返回完全填充的Authentication对象。 否则将抛出AuthenticationException。 **完全填充的验证对象** 经过身份验证 - 是的 授权列表 用户凭据(仅限用户名) 如果抛出任何AuthenticationException,那将由支持身份验证机制的已配置AuthenticationEntryPoint处理。 ## 9.验证完成! AuthenticationManager将获取的完全填充的Authentication对象返回到相关的Authentication 过滤器。 ## 10.在SecurityContext中设置Authentication对象 然后,相关的AuthenticationFilter会将获取的身份验证对象存储在SecurityContext中,以供将来过滤器使用。 (用于授权过滤器) `SecurityContextHolder.getContext().setAuthentication(authentication);` 希望这将有助于您在一定程度上深入了解Spring Security身份验证体系结构。