spring security随笔

234 阅读2分钟

基本原理

UsernamePasswordAuthenticationFilter继承于AbstractAuthenticationProcessingFilter,默认匹配/login

BasicAuthenticationFilter用于httpBasic登录。

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;
}

图片验证码

  1. 生成随机数图片
  2. 将随机数存到session里
  3. 写图片到响应中
  4. 表单登录时从请求中获取验证码和session中的验证码比对

配置的覆盖规则

  1. 请求配置
  2. 应用配置
  3. 默认配置

增量配置

 @ConditionalOnMissingBean

记住'我'

  1. 用户登录认证
  2. 认证成功后,调用RememberMeService通过TokenRepository生成<username,token>
  3. 将token写入浏览器cooike
  4. 将token写入数据库
  5. 请求RememberMeAuthticationFilter,读取cooike的token
  6. 从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。