Spring安全客户端详细信息将作为DaoAuthenticationProvider中的用户详细信息

时间:2017-05-04 06:24:27

标签: spring spring-boot spring-security oauth

Spring Boot,安全OAuth2实现,默认令牌端点(/ oauht / token)工作正常。但是,当我在/ oauth / http / token向新端点发送请求时,由于以下原因,它会抛出Bad Credentials:

FilterChainProxy会触发大约12个过滤器,其中一个过滤器为BasicAuthenticationFilter。它使用UserDetailsServiceDaoAuthenticationProvider来获取用户数据。对于客户端身份验证,这应该是ClientDetailsService,但由于某种原因,这始终是UserDetailsService,因此客户端凭据将转到UserRepository并失败。此类可以正确初始化,因为默认/oauth/token工作正常。

我尝试在BasicAuthenticationFilter中注入现有的身份验证管理器,并将其添加为ResourceServerConfigurerAdapter中的过滤器,但这没有任何区别。它确实将身份验证管理器提供程序从AnonymousAuthenticationProvider更改为DaoAuthenticationProvider,但UserDetailsService仍为UserDetails

/oauth/http/token请求,这不起作用。代码与postAccessToken()

org.springframework.security.oauth2.provider.endpoint.TokenEndpoint几乎相同

enter image description here

在上面的屏幕截图中,我们可以看到userDetailsS​​ervice是UserDetailsS​​erviceImpl,并且由于此请求头中存在的客户端详细信息Basic dGVzdDpwYXNzd29yZA==将转到用户存储库并在用户表中检查而不是转到客户端存储库并在客户端表中检查

请求/oauth/token,这是有效的

enter image description here

1 个答案:

答案 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");
}