如何使用spring security3.0.3来保护这样的业务逻辑?

时间:2010-11-01 13:42:14

标签: spring-security

我有这样的要求。有一个主要业务对象,用户a和用户b,以及管理员。用户a或b可以创建/更新/删除他们自己的业务对象。而用户a无法修改用户b的业务对象。管理员可以做每件事。并且业务对象具有状态,在某些状态下,甚至所有者用户也无法修改它。我想通过spring security来保护它。但它似乎只能通过基于角色的安全性来实现。我觉得我需要使用spring选民,但我不知道如何配置。任何人都可以提供一些代码片段或给我建议吗?

提前致谢。

1 个答案:

答案 0 :(得分: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 Expression Language中表示,则可以通过将自定义变量添加到表达式EvaluationContext中(通过自定义MethodSecurityExpressionHandler)将一些逻辑移动到Java代码。

但是,请注意,您需要在调试模式下编译代码才能在表达式中使用方法参数。

另见: