spring security+Oauth2密码模式认证时,报401,Unauthorized的问题排查

第一种情况:

进行 /auth/token 的post请求时,没有进行http basic认证。

什么是http Basic认证?
http协议的一种认证方式,将客户端id和客户端密码按照“客户端ID:客户端密码”的格式拼接,并用base64编码,放在
header中请求服务端。例子如下:
Authorization:Basic ASDLKFALDSFAJSLDFKLASD=
ASDLKFALDSFAJSLDFKLASD= 就是 客户端ID:客户端密码 的64编码

spring security中的认证主要就是通过一连串的过滤器来做的各种验证。http basic认证的过滤器为 BasicAuthenticationFilter。

下图为BasicAuthenticationFilter中的过滤器执行方法,如果authRequest为空,即header中没有传 Authorization 。

spring security+Oauth2密码模式认证时,报401,Unauthorized的问题排查_第1张图片

 spring security+Oauth2密码模式认证时,报401,Unauthorized的问题排查_第2张图片

 继续往下执行,会执行到 AnonymousAuthenticationFilter 中 doFilter 方法。如下图所示,最终 spring security的会话SecurityContextHolder中会存放一个匿名的认证信息,AnonymousAuthenticationToken,在最终的决策管理器AccessDecisionManager中会导致投票失败。

spring security+Oauth2密码模式认证时,报401,Unauthorized的问题排查_第3张图片

spring security+Oauth2密码模式认证时,报401,Unauthorized的问题排查_第4张图片 

 下图为 AffirmativeBased 决策管理器抛出的 access denied 异常。

spring security+Oauth2密码模式认证时,报401,Unauthorized的问题排查_第5张图片

 

第二种情况:

ClientDetailsServiceConfigurer配置中的clientDetailsService要确保配置成功或者不使用数据库存放数据时要确保clientDetail信息

正确存放到内存memory中。因为spring security执行过程中先去内存中获取,获取不到再去配置的数据库中获取,如果还获取不到,最终也会抛出401 Unauthorized异常。如下图所示

spring security+Oauth2密码模式认证时,报401,Unauthorized的问题排查_第6张图片

spring security+Oauth2密码模式认证时,报401,Unauthorized的问题排查_第7张图片

你可能感兴趣的:(SpringSecurity,Oauth2,安全,java)