我有这样的要求。有一个主要业务对象,用户a和用户b,以及管理员。用户a或b可以创建/更新/删除他们自己的业务对象。而用户a无法修改用户b的业务对象。管理员可以做每件事。并且业务对象具有状态,在某些状态下,甚至所有者用户也无法修改它。我想通过spring security来保护它。但它似乎只能通过基于角色的安全性来实现。我觉得我需要使用spring选民,但我不知道如何配置。任何人都可以提供一些代码片段或给我建议吗?
提前致谢。
答案 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代码。
但是,请注意,您需要在调试模式下编译代码才能在表达式中使用方法参数。
另见: