安全归根节点须要解决两个问题:java
后者有些时候也被人们叫作“访问控制”(access control)。spring security 是一个将鉴权和受权分开的安全框架。包含策略,同时提供对二者的扩展能力。spring
下图描绘了spring security在鉴权处理流程中涉及到的类和过滤器。数据库
public interface AuthenticationManager{ Authentication authenticate(Authentication authentication)throws AuthenticationException; }
实际实现类是 ProviderManager 。该实现类包含了一系列配置的 AuthenticationProvider (s), 这些provider受ProvideManager委托,用于用户请求的鉴权。安全
具体到实现细节, ProviderManager 会遍历每一个AuthenticationProvider,根据传入的Authentication对象(例如: UsernamePasswordAuthenticationToken )尝试鉴权用户。AuthenticationProvider 接口以下所示:springboot
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 接口。ide
若是用户鉴权成功,则返回Authentication对象,相比于传入的未鉴权的对象,这个鉴权后的的对象更“丰满”,包含了用户的角色信息spa
从上图能够看出,鉴权成功的Authentication对象(Fully populated Authentication Object)包含:3d
authenticated- truecode
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/