2012-09-28 63 views
2

我正在使用spring安全@PreAuthorise來檢查誰和誰不能訪問我的服務層中的方法。它工作得很好。通常我的服務方式是用Spring安全@PreAuthorize(「hasAnyRole('....')」)

@PreAuthorize("hasAnyRole('MY_USER_ROLE')") 

我的問題是我有一個由多個jar文件組成的war文件。這些jar文件中的每一個都負責一段業務邏輯。我現在想讓一個jar文件中的某個服務訪問另一個jar文件中的另一個服務。這由於權限而被拒絕。如果我註釋掉權限,那麼一切正常。

無論如何,我可以在撥打此服務前通過春季進行身份驗證嗎? (也許用一個虛擬用戶?)或者關閉相同應用程序內的罐子的安全性?還是我的設計錯了?

其他人都有這種問題?我應該用什麼樣的設計呢?

+0

嗨!我認爲你的潛在問題是一個設計問題。正如你所說的那樣,被其他服務調用的服務似乎應該被分成兩部分,一部分具有權限,另一部分具有特徵或行爲,後者被服務訪問的_private_僅限層。它可能無法實現,因爲你的jar分離,但我認爲它會更整潔。 – coya

回答

2

你需要給調用服務(在其他jar)由@PreAuthorize所需的權限(爲線程被調用的服務)。

如果線程是由用戶請求在Web應用程序中觸發的,那麼這通常是用戶權限。

但是,當線程被一些定時服務觸發,那麼你需要給他們正確的認證

Authentication authentication = new UsernamePasswordAuthenticationToken("dummy", "password"); 
    SecurityContext securityContext = SecurityContextHolder.getContext(); 
    securityContext.setAuthentication(authentication); 
+0

完美地工作。謝謝@Ralph – RNJ

-2

我相信這是一個很好的例子,你應該使用Spring Security @Secured註解

  • 什麼是@Secured註解?
    從版本2.0開始,Spring Security已經大大改進了對服務層方法增加安全性的支持。它爲 提供了對JSR-250註釋安全性以及 框架的原始@Secured註釋的支持。

    來源:Spring Security 3.1 Reference 2.4 Method Security
    @Secured註解允許你把限制在你的方法。例如,您可以授權所有 註冊用戶使用get()方法。但是對於edit()方法,您可以將其標記爲僅供管理員訪問的 。

退房一些教程在:
http://burtbeckwith.com/blog/?p=1398
http://krams915.blogspot.in/2010/12/spring-security-3-mvc-using-secured.html

+0

「@ Secured」應該如何幫助解決這個問題? – Ralph

+0

好的,也許我沒有正確理解您的問題,如果您希望提供虛擬身份驗證,您可以創建一個SYSTEM_ROLE,並授予來自調用服務的權限,將角色添加到安全服務。另外,如果你想禁用安全性,你不能從配置本身做到這一點嗎?<@ PreAuthorize是一個基於'@ Secured'的擴展註釋。「#安全性:全局方法安全性secured-annotations =」已禁用「訪問決策管理器ref =」aclAccessDecisionManager「> – Anshu

+0

。你的建議沒有意義。 – eis