2015-11-11 102 views
2

我明白什麼@Secured DOES,但不知道它是如何做到的。@Secured如何知道用戶來自數據庫的角色?

有人可以解釋@Secured如何抓住角色?它是從authorities-by-username-query得到嗎?只要它在數據庫中,我可以將任何字符串放入參數中嗎?

+2

它從['SecurityContext']獲取角色(http://docs.spring.io/autorepo/docs/spring-security/3.2.0.RELEASE/apidocs/org/springframework/security/core /context/SecurityContext.html)。用戶的角色在認證過程中存儲在安全上下文中,例如使用您提到的「用戶名 - 查詢」權限查詢(取決於您的確切配置)。 –

+0

Ahhhh我明白了,非常感謝。如果您願意並且我會接受,您可以將其作爲答案張貼 – bmarkham

回答

1

用戶的角色存儲在SecurityContext中,或者更具體地說,存儲在SecurityContext中的Authentication對象中。在進行身份驗證時,身份驗證信息將被加載並存儲在安全上下文中。角色可以源自數據庫,具體取決於您的配置。在你的情況下,他們使用authorities-by-username-query查詢加載。

當安全攔截器處理授權(例如使用@Secured註釋的方法級別授權)時,它會根據存儲在上下文中的認證來確定用戶是否應該能夠訪問它。


爲了更好地理解引擎蓋下會發生什麼,你應該看看春季安全過濾器鏈和參考指南的Architecture section

1

SpringSecurity通過使用@Secured提供了令人敬畏的AOP方法來保護 Java應用程序中的方法。 Spring邏輯或操作@Secured註釋中列出的角色 。從SecurityContextHolder.getContext().getAuthentication().getAuthorities()

AbstractSecurityInterceptor獲得GrantedAuthorities的收集是實現了安全的對象 安全攔截抽象類。

  1. 從SecurityContextHolder中獲取Authentication對象。

    1. 通過查找SecurityMetadataSource的安全對象請求,確定請求是否與安全或公共調用 有關。
    2. 對於被固定的調用(有的 ConfigAttributes對安全對象調用的列表):

      • 如果兩個Authentication.isAuthenticated()返回假,或alwaysReauthenticate爲真,認證請求針對配置的AuthenticationManager。驗證後,將SecurityContextHolder上的Authentication對象替換爲返回的值。
      • 根據配置的AccessDecisionManager授權請求。
      • 通過配置的RunAsManager執行任何運行替換。
      • 將控制權交還給具體的子類,它將實際繼續執行該對象。 InterceptorStatusToken被返回,以便在子類完成對象的執行後,它的finally子句可以確保AbstractSecurityInterceptor被重新調用並使用finallyInvocation(InterceptorStatusToken)正確整理。
      • 具體子類將通過afterInvocation(InterceptorStatusToken,Object)方法重新調用AbstractSecurityInterceptor。
      • 如果RunAsManager替換了Authentication對象,則返回SecurityContextHolder到調用AuthenticationManager後存在的對象。
      • 如果定義了AfterInvocationManager,則調用調用管理器並允許它由於返回給調用者而替換該對象。

看那source code了更多的瞭解。

AccessDecisionManager是作爲AffirmativeBased,ConsensusBased或UnanimousBased實現的接口編排的選民,並要求各反過來是否請求用戶應通過@Secured註解出租或拒絕。

+0

我覺得有點複雜。謝謝! – bmarkham

相關問題