Spring Boot,安全OAuth2实现,默认令牌端点(/ oauht / token)工作正常。但是,当我在/ oauth / http / token向新端点发送请求时,由于以下原因,它会抛出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
,这是有效的
答案 0 :(得分:2)
FilterChainProxy
维护的不是单个过滤器链,而是SecurityFilterChain
- s的列表。每个安全过滤器链包含一个请求匹配器和一个过滤器列表。因此,在这些不同的链中,您将有几个BasicAuthenticationFilter
个实例。
将触发哪个过滤器链取决于传入请求和请求匹配器的决定。
/oauth/token
触发由spring oauth创建的链,并在最后使用ClientDetailsService
。
/oauth/http/token
触发由您的Web安全配置创建的另一个链,并使用用户详细信息服务。
所以......这就是原因。要查看在启动时如何创建链,您可以启用安全性调试,例如在application.yml
logging:
level:
org.springframework.security: DEBUG
然后你会看到oauth安全链的创建:
Creating filter chain: OrRequestMatcher [requestMatchers=[Ant [pattern='/oauth/token'], Ant [pattern='/oauth/token_key'], Ant [pattern='/oauth/check_token']]], [org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@4ce4e309, org.springframework.security.web.context.SecurityContextPersistenceFilter@16331720, org.springframework.security.web.header.HeaderWriterFilter@60ef29a5, org.springframework.security.web.authentication.logout.LogoutFilter@4c9638cc, org.springframework.security.oauth2.provider.client.ClientCredentialsTokenEndpointFilter@9eefda5, org.springframework.security.web.authentication.www.BasicAuthenticationFilter@16d090e9, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@484a9950, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@1c4fefe8, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@12082780, org.springframework.security.web.session.SessionManagementFilter@20a49b7b, org.springframework.security.web.access.ExceptionTranslationFilter@24313d10, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@47ce08d2]
请注意请求匹配。
更新:如果您想重新映射'您可以重新配置端点到您自己的端点。
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints)
throws Exception {
endpoints.pathMapping("/oauth/token", "/oauth/http/token");
}