2013-10-06 50 views
7

我將根據([用戶< - >角色< - >右鍵])模型實施定製授權,並將權限與控制器和方法名稱(例如「控制器|方法」)。Spring Security,定製授權,AccessDecisionManager vs安全篩選器

我用定製的UserDetails和AuthenticationProvider的調整給予的授權(here),但檢查源代碼和文檔有關如何自定義比較權威的,我發現有一個過濾器SecurityContextHolderAwareRequestWrapper)實現isGranted和的isUserInRole比較權威,而文檔說使用AccessDecisionManager選民來定製(據我所知)。哪一個應該使用?我在哪裏有控制器和方法(行動)名稱來比較他們的權威?

我對Spring安全有點困惑。除官方文檔外,是否還有其他資源可以說明它的工作原理,我的意思是動作和方法的順序以及如何定製它們。

回答

9

有幾種方法:

  1. 基於角色的,在那裏你爲每個用戶分配一個角色,並繼續
  2. 使用Spring的安全表現
  3. 還有一個新的春天ACL組件之前,檢查其作用可讓您在課堂級別上執行acl控制並存儲在數據庫中。 到目前爲止,我個人的用法是1和2,在這裏你只分配角色給用戶。 但是選項3,您可以創建更細粒度的安全模型,沒有chaning安全模型時不必重新建立你的webapp

基於角色的

基於角色的安全機制,可實現實現的UserDetailsS​​ervice接口並配置spring security來使用這個類。

要學習如何這樣的項目可以實現的,看看下面的教程:在內存中的用戶數據庫基於

  • 表單登錄與Link基於
  • 表單登錄使用自定義的UserDetails服務Link

在短彈簧安全執行幕後以下:

  1. 認證後(例如,提交登錄表單)創建一個認證對象,其中包含登錄憑證。例如,UsernamePasswordAuthenticationFilter創建了一個UsernamePasswordAuthenticationToken
  2. 認證對象被傳遞給AuthenticationManager,該認證對象可以被認爲是認證過程中的控制器。默認實現是ProviderManager
  3. AuthenticationManager通過AuthenticationProvider執行驗證。使用的默認實現是DaoAuthenticationProvider
  4. DaoAuthenticationProvider通過從UserDetailsService中檢索UserDetails來執行驗證。UserDetails可以被認爲是一個數據對象,其中包含用戶憑證,還包括用戶的權限/角色! DaoAuthenticationProvider通過其loadUserByUsername方法 檢索憑證,然後將其與所提供的UsernamePasswordAuthenticationToken進行比較。
  5. UserDetailsS​​ervice收集用戶憑證,權限並從中構建一個UserDetails對象。例如,您可以從數據庫中檢索密碼散列和權限。在配置網站url-patterns時,您可以參考訪問attribute中的權限。此外,您可以通過SecurityContextHolder.getContext()。getAuthentication()來檢索控制器類中的Authentication對象。

Furthemore以更好地瞭解這些類的內部工作的,你可以閱讀的javadoc:

的SpeI

而不是檢查機關,SPEL使您還檢查用戶的其他屬性。 您可以在URL模式中使用它們,但也可以使用@Preauthorize註釋方法。 這種保護業務層的方式不那麼具有侵入性。

ACL基於

的ACL基於模型在Spring Security 3.0推出,但一直沒有得到很好的documented。 他們的建議是查看Contacts XML example,因爲這個人使用他們的新的acl組件。

最後this book包含有關如何進一步定製您的安全願望的很好的例子。