2017-08-29 78 views
0

我正在實現一個使用Spring Security + Spring會話的登錄過程來爲需要創建/維護會話的後端服務的REST構建登錄功能。Spring安全會話ID作爲令牌配置

我不知道我是否正確地接近解決方案,因爲我正在使用自定義端點手動創建會話。也許會話創建需要在授權方法本身完成?或者也許有一種方法可以在後端的一些請求驗證之後讓spring創建會話?我正在使用自定義過濾器和提供程序。

我目前的配置

另外,我有一個問題,因爲後端API與每個請求創建一個新的會話,即使它應該返回401

該解決方案的要求如下:

  1. 客戶端將登錄到第三方認證/授權提供商。驗證通過後,提供者將發出訪問令牌。
  2. API必須驗證客戶端的訪問令牌與第三方提供商。驗證後,API必須創建一個會話並向客戶端返回一個新的令牌(或會話ID)。
  3. 未來對API的調用應該在標頭/ cookie中包含令牌(或sessionID),以便API獲取客戶端的會話。

最大的問題在這裏:是否有遵循使用鏈接到用戶會話令牌基於身份驗證的常用方法?如果是這樣,如果我在春季會話創建會話之前需要進行自定義驗證,並且向此會話添加自定義屬性?

我的代碼位於:https://github.com/munilvc/api-session/tree/master/src/main/java/com/munilvc/poc/security

例如,一些執行示例:

1)執行自定義登錄:

$ curl -X POST http://localhost:8080/app-api/login/createsession -v 
> POST /app-api/login/createsession HTTP/1.1 
> Host: localhost:8080 
> User-Agent: curl/7.49.1 
> Accept: */* 
> 
< HTTP/1.1 200 
< x-auth-token: 15a06ce8-5b34-401a-a05f-a0d933926245 
< Content-Type: application/json;charset=UTF-8 
< Transfer-Encoding: chunked 
< Date: Tue, 29 Aug 2017 01:28:24 GMT 
< 
171{"username":"username1"} 

2)調用另一個端點提供X-auth-令牌:

注意x-auth令牌在響應中被刷新。 (指創建一個新的會話 - 這是我們希望避免,這也發生在響應401)

$ curl -X GET http://localhost:8080/app-api/accounts/2 -H "x-auth-token:15a06ce8-5b34-401a-a05f-a0d933926245" -v 
> GET /app-api/accounts/2 HTTP/1.1 
> Host: localhost:8080 
> User-Agent: curl/7.49.1 
> Accept: */* 
> x-auth-token:15a06ce8-5b34-401a-a05f-a0d933926245 
> 
< HTTP/1.1 200 
< X-Content-Type-Options: nosniff 
< X-XSS-Protection: 1; mode=block 
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate 
< Pragma: no-cache 
< Expires: 0 
< X-Frame-Options: DENY 
< x-auth-token: 42a5db80-e5e1-4127-bd85-e468af4a8fb2 
< Content-Type: application/json;charset=UTF-8 
< Transfer-Encoding: chunked 
< Date: Tue, 29 Aug 2017 01:29:08 GMT 
< 
870{"id":3,"name":"Account 3"} 

PS:我不知道如果我允許提供一個鏈接到堆棧中的代碼溢出。如果沒有,我也可以在這裏粘貼代碼。

非常感謝!

回答

0

根據您的要求,可以使用OpenID Connect對最終用戶進行身份驗證,並授權客戶端,然後客戶端將收到AccessToken。然後可以使用AccessToken來調用後端API(資源服務器)。

看看這個sample/guide關於如何在Spring Security 5中針對外部OAuth 2.0或OpenID Connect提供程序設置登錄。這將滿足您使用外部提供者登錄應用程序並在Spring Security內創建安全會話的要求。

現在您已登錄到應用程序並且客戶端有AccessToken,客戶端可以在請求(授權標頭)中使用AccessToken來調用後端API(資源服務器)。資源服務器應設置來驗證傳入AccessToken。就以如何配置資源服務器一起來看看這款samplemasterjwt-support分支機構)。

我會強烈建議變得越來越熟悉OAuth 2.0 Authorization FrameworkOpenID Connect Core 1.0

祝你好運!