2017-05-04 125 views
2

Spring Boot,Security OAuth2實現,默認令牌端點(/ oauht/token)工作正常。然而,當我在發送/ OAuth的/ HTTP /新端點請求令牌它拋出,因爲以下原因不正確的憑據:Spring安全客戶端詳細信息將作爲DaoAuthenticationProvider中的用戶詳細信息

FilterChainProxy觸發約12過濾器和出其中一個是BasicAuthenticationFilter。它使用DaoAuthenticationProvider類的UserDetailsService來獲取用戶數據。對於客戶端身份驗證,這應該是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

FilterChainProxy維護不是一個單一的過濾器鏈,但SecurityFilterChain -s.Each安全過濾器鏈的列表中包含的請求匹配和過濾器列表。所以你會在這些不同的鏈中有幾個BasicAuthenticationFilter的實例。

其中篩選鏈將被觸發取決於傳入的請求和請求匹配器的決定。

/oauth/token觸發由spring oauth創建的鏈並在末尾使用ClientDetailsService/oauth/http/token觸發您的網絡安全配置創建的另一個鏈,並使用用戶詳細信息服務。

所以......這就是原因。要了解在啓動時如何創建鏈,可以啓用安全性調試,例如,在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.secu[email protected]4ce4e309, org.spring[email protected]16331720, [email protected]9a5, org.[email protected]4c9638cc, org.springframework.secur[email protected]9eefda5, org.springfram[email protected]16d090e9, org.sp[email protected]484a9950, org.springframework.[email protected]1c4fefe8, org.springfram[email protected]12082780, o[email protected]20a49b7b, org[email protected]24313d10, org.springfr[email protected]47ce08d2] 

注請求的匹配。

更新:如果您想將端點重新映射到您自己的端點,您可以重新配置它。

@Override 
public void configure(AuthorizationServerEndpointsConfigurer endpoints) 
     throws Exception { 
    endpoints.pathMapping("/oauth/token", "/oauth/http/token"); 
} 
+0

感謝您的回覆。在檢查你的響應之後,我添加了'http.userDetailsS​​ervice(clientDetailsUserDetailsS​​ervice);'並且這個客戶端表正在被搜索,但正在進行認證的'BasicAuthenticationFilter'使用'PlaintextPasswordEncoder'而不是'DaoAuthenticationProvider'中定義的密碼編碼器。我添加了自定義'BasicAuthenticationFilter'自定義身份驗證管理器,但與此用戶表搜索客戶端ID。無論如何,我可以複製Spring oauth創建的default/oauth/token嗎? –

+0

除'pathMapping()',是否有任何代碼,我可以重寫和添加幾個URL將使用EXACT相同的過濾器鏈正在使用/ outh /令牌 –

+0

我不知道你想要或應該(不)但是你可以使用'AuthorizationServerSecurityConfigurer#addTokenEndpointAuthenticationFilter'在oauth鏈中添加額外的過濾器。過濾器鏈通過'WebSecurityConfigurerAdapter'進行管理,OAuth來自'@ EnableAuthorizationServer'。所有有效的配置都由作者通過'AuthorizationServerConfigurerAdapter'類公開。 –