基本原理
UsernamePasswordAuthenticationFilter继承于AbstractAuthenticationProcessingFilter,默认匹配/login。
BasicAuthenticationFilter用于httpBasic登录。
自定义登陆
- UserDetails
public interface UserDetails extends Serializable { Collection<? extends GrantedAuthority> getAuthorities();//权限 String getPassword(); //密码 String getUsername(); //用户名 boolean isAccountNonExpired(); //账号是否未过期 boolean isAccountNonLocked(); //账号是否未锁定 boolean isCredentialsNonExpired();//密码是否未过期 boolean isEnabled(); //是否被删除 }
认证流程
不同请求间认证信息如何共享
SecurityContextPersistenceFilter:请求时检查session中是否存在SecurityContext,如果有拿出来放到当前线程中SecurityContextHolder。响应时检查当前线程中是否存在SecurityContext,如果有放到Session中。
获取用户认证信息
// 1.
SecurityContextHolder.getContext().getAuthentication()
// 2. mvc会自动处理
getCurrentUser(Authentication authentication){
return authentication;
}
// 只获取用户认证信息
getCurrentUser(@AuthenticationPrincipal UserDetails user){
return user;
}
图片验证码
- 生成随机数图片
- 将随机数存到session里
- 写图片到响应中
- 表单登录时从请求中获取验证码和session中的验证码比对
配置的覆盖规则
- 请求配置
- 应用配置
- 默认配置
增量配置
@ConditionalOnMissingBean
记住'我'
- 用户登录认证
- 认证成功后,调用RememberMeService通过TokenRepository生成<username,token>
- 将token写入浏览器cooike
- 将token写入数据库
- 请求RememberMeAuthticationFilter,读取cooike的token
- 从DB中获取用户名,调用UserDetialsService获取用户信息,设置到securityContext
核心认证组件
AuthenticationManager : 用户认证的管理类,所有的认证请求(比如login)都会通过提交一个未认证得token给AuthenticationManager#authenticate()方法。具体校验动作会由AuthenticationManager将请求转发给具体的AuthenticationProvider来做。根据实现反馈的结果再调用具体的Handler来给用户以反馈。
AuthenticationProvider: 认证的具体实现类,一个provider对应一种认证方式的实现,例如UsernamePasswordAuthenticationProvider,AuthenticationManager只是一个代理接口,真正的认证就是由AuthenticationProvider来做的。一个AuthenticationManager可以包含多个Provider,每个provider通过实现一个support方法来表示自己支持那种Token的认证。AuthenticationManager默认的实现类是ProviderManager。
AuthenticationToken: 所有提交给AuthenticationManager的认证请求都会被封装成一个未认证的token,比如UsernamePasswordAuthenticationToken。经过AuthenticationProvider认证之后返回认证的token。
UserDetailService:获取用户的信息。
SecurityContext:当用户通过认证之后,就会为这个用户生成一个唯一的SecurityContext,里面包含用户的认证信息Authentication。SecurityContext会存放到session里,下次请求会检验session中是否有该用户的SecurityContext。
通过SecurityContext我们可以获取到用户的标识Principle和授权信息GrantedAuthrity。