2011-07-27 33 views
32

我一直在做一些Apache Shiro和Spring Security之間的比較 - 我真的很喜歡Shiro使用的安全模型,並且相信它比Spring Security更乾淨。我可以在Apache Shiro安全註釋中使用表達式嗎?

但是,一個好的方法是能夠從方法級別的安全註釋中引用方法參數。例如,現在我可以這樣類似:

@RequiresPermissions("account:send:*") 
public void sendEmail(EmailAccount account, String to, String subject, String message) { ... } 

在這個例子的情況下,這意味着身份驗證的用戶必須能夠對發送的電子郵件帳戶的電子郵件的權限。

但是,這不夠細粒度,因爲我想要實例級權限!在這種情況下,假設用戶可以擁有電子郵件帳戶實例的權限。所以,我想編寫前面的代碼是這樣的:

@RequiresPermissions("account:send:${account.id}") 
public void sendEmail(EmailAccount account, String to, String subject, String message) { ... } 

通過這種方式,允許字符串是引用傳遞到方法,使得該方法可以被固定以防止EmailAccount的特定實例的參數。

我知道我可以很容易地從該方法中的普通Java代碼做到這一點,但使用註釋實現同樣的事情會很好 - 我知道Spring Security在其註釋中支持Spring EL表達式。

這是絕對不是四郎的功能,因此我將不得不寫我自己的自定義註釋?

感謝,

安德魯

+7

沒有創造新的功能要求? http://shiro.apache.org/issues.html –

+0

多人爲此添加了新的功能請求。例如見:https://issues.apache.org/jira/browse/SHIRO-331 – user64141

回答

6

看那班http://shiro.apache.org/static/current/apidocs/org/apache/shiro/authz/aop/package-summary.html,尤其是PermissionAnnotationHandler。在那裏你可以看到Shiro在遇到@RequiresPermissions註釋時所做的是getSubject().isPermitted(permission),並且根本不在註釋值內進行替換。如果您想要這種功能,您將不得不以某種方式重寫該處理程序。

所以要回答你的問題:是的,這絕對不是四郎的功能,你必須寫自己的註釋或以某種方式覆蓋該處理程序。

+1

@drewzilla我在「我的標籤」視圖中來到這個q/a,我想知道如果答案不是正確。請注意,否定答案也可以是答案。你能否指出答案中是否缺少任何內容? –

2
+0

'$ {account.id}'這顯然是使用Spring的BeanWrapper(反射)。雖然它可能會阻止一些代碼行寫入恕我直言,但這不是安全框架的一部分,正如Shiro打算的那樣。 – lrn2prgrm

+0

太好了,但這還沒有確定。如果我們使用Spring,有沒有什麼方法可以像其他Spring註釋一樣使用它? – tobe

相關問題