Spring Boot,安全OAuth2实现,默认令牌 endpoints (/ oauht / token)工作正常 . 但是,当我向/ oauth / http / token的新 endpoints 发送请求时,由于以下原因,它会抛出Bad Credentials:
FilterChainProxy
触发大约12个过滤器,其中一个是 BasicAuthenticationFilter
. 它使用 UserDetailsService
的 DaoAuthenticationProvider
类来获取用户数据 . 对于客户端身份验证,这应该是 ClientDetailsService
但是,由于某种原因,这始终是 UserDetailsService
,因为此客户端凭据转到 UserRepository
并失败 . 此类确实正确初始化,因为默认 /oauth/token
工作正常 .
我尝试在 BasicAuthenticationFilter
中注入现有的身份验证管理器,并将其添加为 ResourceServerConfigurerAdapter
中的过滤器,但这没有任何区别 . 它确实将身份验证管理器提供程序从 AnonymousAuthenticationProvider
更改为 DaoAuthenticationProvider
,但 UserDetailsService
仍然是 UserDetails
.
请求 /oauth/http/token
,这不起作用 . 代码与 postAccessToken()
的 org.springframework.security.oauth2.provider.endpoint.TokenEndpoint
几乎相同
在上面的屏幕截图中,我们可以看到userDetailsService是UserDetailsServiceImpl,并且由于此请求头中存在此客户端详细信息,因为 Basic dGVzdDpwYXNzd29yZA==
将转到用户存储库并在用户表中检查而不是转到客户端存储库并在客户端表中进行检查 .
请求 /oauth/token
,这是有效的
1 回答
FilterChainProxy
维护的不是单个过滤器链,而是SecurityFilterChain
-s.Each安全过滤器链的列表包含请求匹配器和过滤器列表 . 因此,您将在这些不同的链中拥有多个BasicAuthenticationFilter
实例 .将触发哪个 filter chain 取决于传入的请求和请求匹配的决定 .
/oauth/token
触发由spring oauth创建的链,并在末尾使用ClientDetailsService
./oauth/http/token
触发由您的Web安全配置创建的另一个链,并使用用户详细信息服务 .所以......这就是原因 . 要查看在启动时如何创建链,您可以启用安全性调试,例如,在
application.yml
然后你会看到oauth安全链的创建:
请注意请求匹配 .
UPDATE: 如果要将 endpoints 'remap'到您自己的 endpoints ,您可以重新配置它 .