第一种情况:
进行 /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 。
继续往下执行,会执行到 AnonymousAuthenticationFilter 中 doFilter 方法。如下图所示,最终 spring security的会话SecurityContextHolder中会存放一个匿名的认证信息,AnonymousAuthenticationToken,在最终的决策管理器AccessDecisionManager中会导致投票失败。
下图为 AffirmativeBased 决策管理器抛出的 access denied 异常。
第二种情况:
ClientDetailsServiceConfigurer配置中的clientDetailsService要确保配置成功或者不使用数据库存放数据时要确保clientDetail信息
正确存放到内存memory中。因为spring security执行过程中先去内存中获取,获取不到再去配置的数据库中获取,如果还获取不到,最终也会抛出401 Unauthorized异常。如下图所示