一、简介
安全框架
包含两个部分:
1、认证:用户登录
2、授权:用户拥有什么权限、可以访问什么资源
二、认证流程
-
UsernamePasswordAuthenticationToken 实现了 Authentication 接口,是 Spring Security 中用于封装用户名密码认证信息的一个类
-
调用AuthenticationManager的authenticate方法进行认证
-
因为AuthenticationManager中管理了一群Provider,所以调用的就是那一群Provider的 authenticate方法进行认证(AuthenticationManager的实现类是ProviderManager)
-
调用DaoAuthenticationProvider的authenticate方法进行认证(AuthenticationProvider的实现类是DaoAuthenticationProvider),获得DaoAuthenticationProvider的UserDetailService的对象,调用此对象的loaduserByUsername,查询数据库,返回UserDetails对象
-
通过PasswordEncoder对比UserDetails与Authentication的密码是否一致,一致则将权限设置进Authentication
代码断点调式整个流程
1、authenticationManager.authenticate
2、ProviderManager
3、AbstractUserDetailsAuthenticationProvider
4、DaoAuthenticationProvider
5、UserDetailsServiceImpl
补充:UsernamePasswordAuthenticationToken
用于认证前的构造方法
public UsernamePasswordAuthenticationToken(Object principal, Object credentials)
principal
:用户身份信息,一般是用户名credentials
:用户凭证,一般是密码
用于认证后的构造方法
public UsernamePasswordAuthenticationToken(Object principal, Object credentials,
Collection<? extends GrantedAuthority> authorities)
principal
:用户身份信息(通常是UserDetails
对象)credentials
:凭证信息(通常不再使用,可以设置为null
)authorities
:用户权限信息
1、认证前
login实现类
Authentication authentication =
new UsernamePasswordAuthenticationToken(username, password);
Authentication authenticated = authenticationManager.authenticate(authentication);
SecurityContextHolder.getContext().setAuthentication(authenticated);
2、认证后
JWT过滤器类
// 创建认证后的对象
UsernamePasswordAuthenticationToken authentication =
new UsernamePasswordAuthenticationToken(
userDetails, null, userDetails.getAuthorities()
);
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
// 存入 SecurityContext
SecurityContextHolder.getContext().setAuthentication(authentication);