Spring Boot 2.x实战78 - Spring Security 2 - Spring Security的认证(Authentication)

1.3 Authentication

Spring Security为我们提供了一个专门的org.springframework.security.core.Authentication接口来代表认证;它最常用的实现类有UsernamePasswordAuthenticationToken

一旦请求被认证后,Authentication对象就会自动存储在由SecurityContextHolder管理的SecurityContext中。

认证的原理通过下面类的处理顺序来进行的:

  • FilterChainProxy:Servlet过滤器(FilterspringSecurityFilterChain实际类型是FilterChainProxy,它可能包含多个过滤器链(DefaultSecurityFilterChain),每个过滤器链包含多个过滤器。特定的过滤器会将请求中的认证信息(如用户名、密码)构造成Authentication对象交由AuthenticationManagerauthenticate方法处理。主要的过滤器有:

    • UsernamePasswordAuthenticationFilter:使用表单(用户名、密码)提交进行认证信息,构造的Authentication对象类型为UsernamePasswordAuthenticationToken;并调用AuthenticationManagerauthenticate来进行认证操作。
    • BasicAuthenticationFilter:使用HTTP请求的基础授权头提交认证信息,同样构造的Authentication对象的类型为UsernamePasswordAuthenticationToken;并调用AuthenticationManagerauthenticate来进行认证操作。
    • ExceptionTranslationFilter:处理过滤器链中的异常
      • AuthenticationException:认证异常,返回401状态码
      • AccessDeniedException:授权异常,返回403状态码
    • FilterSecurityInterceptor:它是AbstractSecurityInterceptor的子类,当认证成功后,再使用AccessDecisionManager对Web路径资源(web URI)进行授权操作。
  • AuthenticationManagerAuthenticationManager接口的实现为ProviderManager,我们使用AuthenticationManagerBuilder来定制构建AuthenticationManager

  • ProviderManagerProviderManager通过它authenticate方法将认证交给了一组顺序的AuthenticationProvider来完成认证。

  • AuthenticationProviderAuthenticationProvider接口包含两个方法:

    • supports:是否支持认证安全过滤器缓解构造的Authentication
    • authenticate:对Authentication进行认证,若认证通过返回Authentication,若不通过则抛出异常。
  • DaoAuthenticationProviderDaoAuthenticationProviderAuthenticationProvider接口的实现,他支持认证的Authentication类型为UsernamePasswordAuthenticationToken。它在认证中主要用到了下面三个部分:

    • UserDetailsService:从指定的位置(如数据库)获得用户信息;通过比较用户信息和AuthenticationUsernamePasswordAuthenticationToken)中的用户名和密码信息,若认证通过则构建新的AuthenticationUsernamePasswordAuthenticationToken),包含用户的权限信息。
    • PasswordEncoder:使用PasswordEncoder将请求传来的明文密码和存储的编码后的密码进行匹配比较。
1.3.1 配置AuthenticationManager

我们可以重载WebSecurityConfigurerAdapter类的方法,使用AuthenticationManagerBuilder来配置AuthenticationManager

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
   

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
   
        //auth.
    }

}

我们可以通过配置UserDetailsServiceAuthenticationProvider定制认证。

1.3.2 UserDetailsService

本例定制一个UserDetailsService通过Spring Data JPA从数据库中获取用户。

基本外部配置:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/first_db?useSSL=false
    username: root
    password: zzzzzz
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    show-sql: true
    hibernate:
      ddl-auto: update

我们用户的实体:

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
public class SysUser implements UserDetails {
   
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String realName;

    @Column(unique = true)
    private String username;

    private String password;
  
    public SysUser(String realName, String username, String password) {
   
        this.realName = realName;
        this.username = username;
        this.password = password;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
    //1
        return null;
    }

    @Override
    public String getPassword() {
    //2
        return this.password;
    }

    @Override
    public String getUsername() {
    //3
        return this.username;
    }

    @Override
    public boolean isAccountNonExpired() {
    //4
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
    //5
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
    //6
        return true;
    }

    @Override
    public boolean 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值