如何通过@Transactional使@PostAuthorize失败导致回滚?

时间:2016-07-29 15:24:50

标签: spring-security spring-boot

我的应用程序中有一些复杂的访问限制,基本上需要查看用户角色的组合,以及域对象的一些深层属性,以便做出访问决策。

对于我的一些方法(特别是像getItem(Integer id)updateItem(Integer id, FormBean form)这样的事情),如果他们被允许访问该项目我就不能提前知道,因为我没有它,所以我一直在使用@PostAuthorize。

然而,后一个例子updateItem(id, form)提出了挑战。我只想让他们在某些特定情况下更新表格。现在,我确实看到@PostAuthorize导致他们在做他们不应该做的事情时得到HTTP 403响应,但数据库更改没有回滚。

在这种情况下,是否可以让@PreAuthorize@Transactional@PostAuthorize在一起玩得很好? (我想也许可以通过调整一些建议的顺序......但我不完全清楚应该如何进行排序。)

或者,我的系统是否变得足够复杂以至于我真的应该在域ACL上咬紧牙关?不幸的是,关于那些的文档感觉相当薄......

2 个答案:

答案 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