安全归根节点需要解决两个问题:
后者有些时候也被人们叫做“访问控制”(access control)。spring security 是一个将鉴权和授权分开的安全框架。包含策略,同时提供对两者的扩展能力。
下图描绘了spring security在鉴权处理流程中涉及到的类和过滤器。
public interface AuthenticationManager{ Authentication authenticate(Authentication authentication)throws AuthenticationException; }
实际实现类是 ProviderManager 。该实现类包含了一系列配置的 AuthenticationProvider (s), 这些provider受ProvideManager委托,用于用户请求的鉴权。
具体到实现细节, ProviderManager 会遍历每个AuthenticationProvider,根据传入的Authentication对象(例如: UsernamePasswordAuthenticationToken )尝试鉴权用户。AuthenticationProvider 接口如下所示:
public interface AuthenticationProvider { Authentication authenticate(Authentication authentication) throws AuthenticationException; boolean supports(Class<?> authentication); }
这里是一些Spring security框架提供的AuthenticationProvider:
public interface UserDetailsService{ UserDetails loadUserByUsername(String username) throws UsernameNotFoundException; }
UserDetailsService 返回 UserDetails 。而 User 是 UserDetails 的具体实现类,当然用户也可以自行实现 UserDetails 接口。
如果用户鉴权成功,则返回Authentication对象,相比于传入的未鉴权的对象,这个鉴权后的的对象更“丰满”,包含了用户的角色信息
从上图可以看出,鉴权成功的Authentication对象(Fully populated Authentication Object)包含:
authenticated- true
grant authorities list :关联的角色(角色和权限挂钩)
user credentials:用户凭证(仅仅包含用户名)
如果鉴权未通过,则抛出异常 AuthenticationException 。该异常属于运行时异常,不期望用户通过try/catch去处理,spring security提供了一种通用的方式。即通过AuthenticationEntryPoint 处理:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.anyRequest().authenticated()
.and()
.exceptionHandling()
.authenticationEntryPoint(unauthorizedHandler);
}
9. Authentication is done! 鉴权成功后,AuthenticationManager返回包含完整信息的鉴权对象给相关的Authentication Filter。
10. 将返回的鉴权对象保存到SecurityContext,用于后续过滤器的使用。比如Authorization Filters
SecurityContextHolder.getContext().setAuthentication(authentication);
https://springbootdev.com/2017/08/23/spring-security-authentication-architecture/
原文:https://www.cnblogs.com/yanzhenjingyan/p/10382594.html