Spring Security 集成笔记

449 阅读2分钟

1. 未认证 和 认证失败

1.1 字面说明

未认证 是指未提供用户信息; 认证失败 是指提供了用户信息,但是信息未通过验证;

1.2 代码中的标志

未认证 在SpringSecurity中有两种表示:

  1. 第一种是抛出 AuthenticationException
  2. 第二种是抛出 AccessDeniedException 并且 用户是低安全级别用户(匿名用户或者remember-me用户)

认证失败在SpringSecurity中

  1. 抛出 AuthenticationException

看起来和未认证一样,是不是? 原因在于AbstractAuthenticationProcessingFilter中的代码。 登录认证是已知的不需要认证的请求,所以在这个类里处理的时候,就分了两个分支了。

如果是需要认证的,那么处理过程中会调用各种filter,目标就是从request中取出各种信息来完成认证,最后实在拿不到用户的信息,那么就让他去登录;

如果是不需要登录的(记住这里是spring security,它的工作上下文就是为了完成认证),那么它就取用户名和密码(为什么直接取?因为我是spring security, 这里是AbstractAuthenticationProcessingFilter,就是完成认证的)完成认证。 这些都是函数 attemptAuthentication()引入的。它会导致 getAuthenticationManager().authenticate 的参与。
> 这就是为什么我们要实现自己的认证方法的时候,需要写这么一段 ``auth.authenticationProvider(new MyAuthenticationProvider())`` 的原因:就是把自己的provider引入进来

未认证的结果,最后会调用到我们(网上搜索最常见的未认证)的 sendStartAuthentication 方法,最后调到 AuthenticationEntryPoint的commence() 方法。

这就是为什么很多帖子说“自定义未登录处理时要重载AuthenticationEntryPoint的原因

未认证 的默认处理器是 LoginUrlAuthenticationEntryPoint.java, 瞅瞅就知道了,代码很简单,就是发个 login 的url redirection。 咱们自定义,往往就是加点header什么的,url反正也可以配置。

认证失败会调到 failureHandler.onAuthenticationFailure() 这个方法,这就是为什么我们要配置failureHandler的原因。