2017-10-17 67 views
3

你能解釋在哪裏處理@PreAuthorize(「hasRole('ADMIN')」)的通知在Reactive應用程序中檢索SecurityContext?@PreAuthorize如何在反應式應用程序中工作或者如何在沒有ThreadLocal的情況下工作?

下Spring Security的例子是這種用法的一個很好的例子:https://github.com/spring-projects/spring-security/tree/5.0.0.M4/samples/javaconfig/hellowebflux-method

檢查春季安全Webflux源代碼後,我發現SecurityContextRepository的一些實現,但load方法需要ServerWebExchange作爲參數。我試圖瞭解如何替換標準服務中的SecurityContextHolder.getContext()。getAuthentication()調用(因爲ThreadLocal不再是一個反應式應用程序中的選項),但我不明白如何替換這是通過調用SecurityContextRepository而不是在ServerWebExchange上引用。

回答

3

你是對的,ThreadLocal不再是一個選項,因爲處理請求不是綁定到特定的線程。

目前,Spring Security將身份驗證信息存儲爲ServerWebExchange屬性,因此綁定到當前的請求/響應對。但是,如果您沒有直接訪問當前的交易所,您仍然需要這些信息,例如@PreAuthorize

的認證信息存儲在無管道本身(從MonoFlux所以訪問),這是一個非常有趣的反應器的功能 - 管理依賴於特定的Subscriber(在Web應用程序,HTTP客戶端是上下文從服務器提取數據並且如此操作)。

我不知道相當於SecurityContextHolder,或從上下文獲取身份驗證信息的一些快捷方法。

查看更多about Reactor Context feature in the reference documentation。 您還可以看到that being used in Spring Security here的示例。

相關問題