2012-12-07 123 views
4

我們有一個應用程序,用戶可以由管理員創建並將角色分配給特定類型的實體。Spring MVC中的自定義授權

例如,如果實體被稱爲Student,應用程序的用戶有不同程度的優惠,如:

  • VIEWER - 查看學生詳細介紹
  • 編輯器 - 編輯學生詳細介紹
  • 出口商 - 出口學生詳細信息

用於執行上述操作的URI如下所示:

  • GET - /content/{classId}/{studentId}/view
  • PUT - /content/{classId}/{studentId}
  • GET - /content/{classId}/{studentId}/export
  • POST - /content/{classId}/{studentId}/export

注意,URI是一個動態性的。此外,給定用戶User A可以被分配VIEWER角色Class 1EXPORTER對於Class 2

在我的spring-security配置中,我只定義了兩個權限 - ADMINISTRATORUSER

  • ADMINISTRATOR - 可以訪問所有
  • USER - 除了/admin/* URI可以訪問一切。

角色VIEWER,EDITOR,EXPORTER不是彈簧安全角色。現在我遇到了一個問題,同時限制用戶訪問他們沒有權限的資源。

此外,如果用戶沒有EXPORTER權限,他甚至不應該看到按鈕(放置在應用程序的某處)。也許我可以用彈簧的security taglib來做到這一點。但這完全是另一個問題。

我可以讓他們的安全意識,但問題是我在哪裏把我的邏輯閱讀{studentId}@PathVariable)並匹配它與當前登錄的用戶,以檢查他是否有權訪問它。

我甚至想到創建一個過濾器/ HandlerInterceptor,在/content/*上偵聽的想法。但是我將不得不做一些醜陋的事情,比如解析URI,自己提取第二個路徑參數,然後檢查數據庫。

有沒有更優雅的,彈簧安全的做法呢?

任何想法的歡迎。

+0

我個人使用Shiro。它工作得很好。 –

回答

3

你可以提供彈簧安全你自己執行SecurityExpressionHandler。只需延長DefaultWebSecurityExpressionHandler並覆蓋createSecurityExpressionRoot即可。默認情況下,此方法返回WebSecurityExpressionRoot的實例。你的實現可以擴展這個類並添加額外的方法,你可以在你的spring安全配置中使用它。

這裏是你如何提供你自己的SecurityExpressionHandler的實現。該代碼來自spring security documentation

<security:global-method-security pre-post-annotations="enabled"> 
    <security:expression-handler ref="expressionHandler"/> 
</security:global-method-security> 

<bean id="expressionHandler" class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler"> 
    <property name="permissionEvaluator" ref="myPermissionEvaluator"/> 
</bean> 

其答案是否提供足夠的信息,或者你需要更多的幫助?

+0

謝謝,我會探索一下,回到你身邊。 – adarshr

+0

歡迎您。順便說一下,這裏是另一個問題+與類似主題的答案:http://stackoverflow.com/questions/6632982/how-to-create-custom-methods-for-use-in-spring-security-expression-language -anno – Yevgeniy

+0

我只需要實現'PermissionEvaluator'並在我的'@ RequestMapping'上使用'@PreAuthorize(「hasPermission(#studentId,'EDITOR')'等等。但是,因爲我有一個專用的控制器URI根,我只需要在類級別定義'@ PreAuthorize'。非常感謝。 – adarshr