SpringSecurityユーザ認証プロセス分析の原則

1.ユーザ認証プロセスフロー原理

ここに画像を挿入説明

1.1 AuthenticationFilter

  1. インターセプト・チェーン・モデルによれば、別のログインが異なるAuthenticationFilterを持っています
  2. アカウントのパスワードがログインするために使用した場合、となりますUsernamePasswordAuthenticationFilterインターセプトに
  3. メソッドを作成オブジェクトをUsernamePasswordAuthenticationFilterattemptAuthentication()UsernamePasswordAuthenticationToken
  • UsernamePasswordAuthenticationFilter.java、アカウントのパスワードフィルタ
public Authentication attemptAuthentication(HttpServletRequest request,
			HttpServletResponse response) throws AuthenticationException {
    //1. 创建UsernamePasswordAuthenticationToken对象
		UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(
				username, password);
	//2. 接着进入AuthenticationManager管理器中选择对应的AuthenticationProvider验证器进行校验
		return this.getAuthenticationManager().authenticate(authRequest);
	}
  • UsernamePasswordAuthenticationToken.java、オブジェクトを作成します
//构造器
public UsernamePasswordAuthenticationToken(Object principal, Object credentials) {
		super(null);//未认证,将权限信息设置为null
		this.principal = principal;//将账号密码保存到本地
		this.credentials = credentials;//将权限信息保存到本地
		setAuthenticated(false);//认证状态为false
}

1.2 AuthenticationManager

  1. AuthenticationManager多くの管理を担当するAuthenticationProviderこれらのプロバイダは、異なるランディングアプローチの異なる較正手順を提供することができます
  2. 取得することによりProvicerManager、その呼び出しauthenticate()のすべてを通じてメソッドをチェックモードプロバイダーを検証するために、現在のログインモードをサポートするためのバリデータを取得します
  3. あなたはプロバイダーによって対応するログインを見つけるでしょうprovider.authenticate(authentication);、プロバイダの提供を呼び出して検証チェックサムの道を

1.3 AuthenticationProvider

  1. ここでは一例として、アカウントのパスワードは、それを達成するために使用されるAbstractUserDetailsAuthenticationProvider特定の実装クラスをDaoAuthenticationProviderチェックサムを実行します。
  2. 検証プロセスが呼び出すメソッドをAbstractUserDetailsAuthenticationProviderauthenticate
  3. 検証プロセスは3つの段階に分かれています。
    1. preAuthenticationChecks.check(user);アカウントがために事前チェックは、4つの方法UserDetailsインタフェースに応じて、有効になっているアカウントロックアウトの場合、アカウントは、期限が切れている状態チェック
    2. additionalAuthenticationChecks();,密码校验,该方法在是DaoAuthenticationProvider中进行了实现,通过我们配置的PasswordEncoder进行密码校验
    3. postAuthenticationChecks.check(user);,后校验,检验密码是否过期;
  4. 用户认证成功后,就会根据我们提供的UserDetails信息,执行createSuccessAuthentication(principalToReturn, authentication, user);方法;
  5. 创建了一个新的UsernamePasswordAuthenticationToken对象,并以Authentication的形式返回
  • UsernamePasswordAuthenticationToken.java
public UsernamePasswordAuthenticationToken(Object principal, Object credentials,
			Collection<? extends GrantedAuthority> authorities) {
    super(authorities);//保存用户权限信息
    this.principal = principal;
    this.credentials = credentials;
    super.setAuthenticated(true); // 认证成功
}

1.4 返回AuthenticationFilter处理登录结果

  1. Authentication保存最终认证成功的用户认证对象,该对象将返回到最开始的拦截器当中
  2. 最终返回拦截器链中的AbstractAuthenticationProcessingFilter,执行该过滤器的doFilter方法
  3. 在doFilter中,执行successfulAuthentication(request, response, chain, authResult);来执行登录成功的处理器,
  4. successHandler.onAuthenticationSuccess(request, response, authResult);登录成功处理器执行登陆成功的业务逻辑;
  5. 如果在这个认证过程中出现失败都会抛出异常并被过滤器捕获,执行登录失败处理器

2.在多个请求中共享认证结果原理

ここに画像を挿入説明

  1. 在用户认证流程过程中,若认证成功的认证信息最后会传回到认证拦截器链当中,并在doFilter中执行successfulAuthentication(request, response, chain, authResult);,去调用我们自定义的认证成功处理器,在调用认证成功处理器之前有一句代码是将用户信息传入SecurityContext
  2. SecurityContextHolder.getContext().setAuthentication(authResult);
  3. SecurityContext是用来包装Authentication对象而已
  4. SecurityContextHodler来获取容器保存用户认证信息,这里的SercurityContextHolder可以视为一个线程级别的变量对象,可被多个线程所共享;、
  5. 在拦截器链的最开始,有一个拦截器叫SecurityContextPersistenceFilter,它的作用有两个
    1. 要求が入ってきた場合:セッションのチェック、それはアウトになる場合は、要求スレッドを入れ、SecurityContextがセッションが(すなわち、ユーザ認証情報がない)かどうかを判断します。
    2. リクエストが完了**戻り値のとき:そこたSecurityContextは**セッションにスレッド、認証情報を確認しています

ここに画像を挿入説明

ユーザー認証情報を入手3.

  1. この方法の一つ:SecurityContextHolder.getContext().getAuthentication()
  2. 方法2:コントローラのパラメータで、自動的に注入ユーザ認証情報に型宣言認証、SPRINGMVC米国。
  • 完全な認証情報について
@GetMapping("/authentication")
public Authentication getUser(Authentication authentication){
    return authentication;
}
  • ユーザーは、基本的な情報を得ます
@GetMapping("/userDetail")
public UserDetails getUser(@AuthenticationPrincipal  UserDetails userDetails){
    return userDetails;
}
リリース5元の記事 ウォンの賞賛0 ビュー209

おすすめ

転載: blog.csdn.net/drama_CJL/article/details/104237856