我有這樣的要求。有一個主要業務對象,用戶a和用戶b以及管理員。用戶a或b可以創建/更新/刪除他們自己的業務對象。用戶a不能修改用戶b的業務對象。管理員可以做任何事情。而業務對象具有狀態,在某些狀態下,即使所有者用戶也不能修改它。我想通過春季安全來保證這一點。但似乎只能通過基於角色的安全來實現。我覺得我需要使用春季選民,但我不知道如何配置。任何人都可以提供一些代碼片斷或給我建議嗎?如何使用spring security3.0.3來保護這樣的業務邏輯?
在此先感謝。
我有這樣的要求。有一個主要業務對象,用戶a和用戶b以及管理員。用戶a或b可以創建/更新/刪除他們自己的業務對象。用戶a不能修改用戶b的業務對象。管理員可以做任何事情。而業務對象具有狀態,在某些狀態下,即使所有者用戶也不能修改它。我想通過春季安全來保證這一點。但似乎只能通過基於角色的安全來實現。我覺得我需要使用春季選民,但我不知道如何配置。任何人都可以提供一些代碼片斷或給我建議嗎?如何使用spring security3.0.3來保護這樣的業務邏輯?
在此先感謝。
Spring Security的3支持@PreAuthorize
註解,讓您的明確授權邏輯Spring Expression Language,像這樣:
public class BusinessService {
@PreAuthorize("hasRole('ADMINISTRATOR') or " +
"(#o.status != 'someStatus' and hasRole('USER') and #o.ownerName == principal.name)")
public void updateBusinessObject(BusinessObject o) {
...
}
}
而你需要<security:global-method-security pre-post-annotations="enabled"/>
應用安全方面。
如果表達式太複雜而無法在Spring表達式語言中表示,則可以通過將自定義變量添加到表達式的EvaluationContext
(通過自定義MethodSecurityExpressionHandler
)將某些邏輯移動到Java代碼。
但是請注意,爲了在表達式中使用方法參數,需要將代碼編譯爲調試模式。
參見:
謝謝,這將是great.But我用這個@PreAuthorize(「hasRole( 'ROLE_ADMIN')或(#task.status <3和hasRole('ROLE_USER'))「)。它沒有工作。我以任務所有者的身份登錄,任務的狀態== 3,但我仍然可以更新此任務 – Tom 2010-11-02 05:51:12
@Tom:確保安全性方面得到正確應用。 – axtavt 2010-11-02 11:45:36
@Tom:另請注意,由於此方法使用Spring AOP,因此它僅適用於來自課程外部的調用。 – axtavt 2010-11-02 12:06:33