我的应用程序中有一些复杂的访问限制,基本上需要查看用户角色的组合,以及域对象的一些深层属性,以便做出访问决策。
对于我的一些方法(特别是像getItem(Integer id)
和updateItem(Integer id, FormBean form)
这样的事情),如果他们被允许访问该项目我就不能提前知道,因为我没有它,所以我一直在使用@PostAuthorize。
然而,后一个例子updateItem(id, form)
提出了挑战。我只想让他们在某些特定情况下更新表格。现在,我确实看到@PostAuthorize
导致他们在做他们不应该做的事情时得到HTTP 403响应,但数据库更改没有回滚。
在这种情况下,是否可以让@PreAuthorize
,@Transactional
和@PostAuthorize
在一起玩得很好? (我想也许可以通过调整一些建议的顺序......但我不完全清楚应该如何进行排序。)
或者,我的系统是否变得足够复杂以至于我真的应该在域ACL上咬紧牙关?不幸的是,关于那些的文档感觉相当薄......
答案 0 :(得分:2)
Spring框架使用Ordered来定义bean的顺序。 显式定义@Transactional和@PostAuthorize的顺序的最简单方法是通过注释:
@EnableTransactionManagement(order = 0)
@EnableGlobalMethodSecurity(prePostEnabled = true, order = 1)
答案 1 :(得分:-1)
为什么不使用@PreAuthorize("hasPermission(#id, 'read')")
和@PreAuthorize("hasPermission(#id, 'update')")
以及implement your own version of PermissionEvaluator
?
但如果您确实希望使用@PostAuthorize
,那么您可以尝试摆弄安全和交易方面的排序,as is described here。