2010-11-01 39 views
0

我有這樣的要求。有一個主要業務對象,用戶a和用戶b以及管理員。用戶a或b可以創建/更新/刪除他們自己的業務對象。用戶a不能修改用戶b的業務對象。管理員可以做任何事情。而業務對象具有狀態,在某些狀態下,即使所有者用戶也不能修改它。我想通過春季安全來保證這一點。但似乎只能通過基於角色的安全來實現。我覺得我需要使用春季選民,但我不知道如何配置。任何人都可以提供一些代碼片斷或給我建議嗎?如何使用spring security3.0.3來保護這樣的業務邏輯?

在此先感謝。

回答

0

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代碼。

但是請注意,爲了在表達式中使用方法參數,需要將代碼編譯爲調試模式。

參見:

+0

謝謝,這將是great.But我用這個@PreAuthorize(「hasRole( 'ROLE_ADMIN')或(#task.status <3和hasRole('ROLE_USER'))「)。它沒有工作。我以任務所有者的身份登錄,任務的狀態== 3,但我仍然可以更新此任務 – Tom 2010-11-02 05:51:12

+0

@Tom:確保安全性方面得到正確應用。 – axtavt 2010-11-02 11:45:36

+0

@Tom:另請注意,由於此方法使用Spring AOP,因此它僅適用於來自課程外部的調用。 – axtavt 2010-11-02 12:06:33