Spring security认证流程

一、 过滤器:UsernamePasswordAuthenticationFilter

1、发起认证:authenticate()

默认调用ProviderManager类authenticate()方法

this.getAuthenticationManager().authenticate(authRequest);

1.1、 管理者组:AuthenticationManager

获取管理者,默认管理者ProviderManager。

 protected AuthenticationManager getAuthenticationManager() {
        return this.authenticationManager;
    }

1.2、 认证信息:UsernamePasswordAuthenticationToken

获取账户信息,封装数据到认证类。

String username = this.obtainUsername(request);
String password = this.obtainPassword(request);
UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);

二 、管理者:ProviderManager

1、发起认证:authenticate()

默认调用AbstractUserDetailsAuthenticationProvider类authenticate()方法

result = provider.authenticate(authentication);

1.1、提供者组:AuthenticationProvider

获取提供者,默认提供者AbstractUserDetailsAuthenticationProvider

AuthenticationProvider provider = (AuthenticationProvider)var8.next();

三、 提供者:AbstractUserDetailsAuthenticationProvider

1、用户信息:retrieveUser()

默认调用DaoAuthenticationProvider类retrieveUser()方法

  user = this.retrieveUser(username, (UsernamePasswordAuthenticationToken)authentication);
}

1.1 提供者:DaoAuthenticationProvider

默认调用InMemoryUserDetailsManager类loadUserByUsername()方法

 UserDetails loadedUser = this.getUserDetailsService().loadUserByUsername(username);
1.1.1 信息者组:UserDetailsManager

获取信息者,默认信息者InMemoryUserDetailsManager

 protected UserDetailsService getUserDetailsService() {
        return this.userDetailsService;
    }

2、判断账号状态:check()

isAccountNonExpired():当前账号是否已经过期
isAccountNonLocked():当前账号是否被锁
isEnabled():当前账号是否被禁用

  this.preAuthenticationChecks.check(user);

3、判断账号密码:additionalAuthenticationChecks()

this.additionalAuthenticationChecks(user, (UsernamePasswordAuthenticationToken)authentication);

4 、判断账号状态 :check()

isCredentialsNonExpired():当前账号证书(密码)是否过期

 this.postAuthenticationChecks.check(user);

四 、信息者:InMemoryUserDetailsManager

1、获取用户信息:loadUserByUsername()

 UserDetails user = (UserDetails)this.users.get(username.toLowerCase());

五、自定义信息者:XXXUserDetailsServiceIpml

public class XXXUserDetailsServiceIpml  implements UserDetailsService 

1、具体逻辑代码

public UserDetails loadUserByUsername(String username){
1、获取用户账号密码,每次接口调用都会被调用,所以应当取缓存,取不到在获取数据库。

2、赋值,User类提供了返回的构造方法。实现了UserDetails接口类
return new User(username, password, enabled, true, true, true, AuthorityUtils.NO_AUTHORITIES);

}

2、接口类:UserDetails

public interface UserDetails extends Serializable {
    Collection<? extends GrantedAuthority> getAuthorities();

    String getPassword();

    String getUsername();

    boolean isAccountNonExpired();

    boolean isAccountNonLocked();

    boolean isCredentialsNonExpired();

    boolean isEnabled();
}

3、方法解释

getPassword():用户密码
getUsername():用户名称
下面4个方法值,必须为ture。否则会报相应错误
isAccountNonExpired():当前账号是否已经过期
isAccountNonLocked():当前账号是否被锁
isCredentialsNonExpired():当前账号证书(密码)是否过期
isEnabled():当前账号是否被禁用

  • 15
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邓厂长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值