【问题标题】:Spring security 3.2 - @PostAuthorize expressions to evaluate principal against the method's returned objectSpring security 3.2 - @PostAuthorize 表达式来根据方法的返回对象评估主体
【发布时间】:2014-10-13 20:23:30
【问题描述】:

我使用 Spring Security 来保护和评估 @PostAuthorize 和 @PreAuthorize 注释中的表达式以授权服务方法。我有一个需求,需要检查返回的对象是否与登录系统并调用此方法的用户ID相同。

// this allows the ids of other users too
@PostAuthorize("#returnObject!=null?returnObject.userId==principal.account.acid:true")
public AudioClip findAudioClip(int clipId) {
     .....
     AudioClip clip = dao.findById(clipId);
     // may also be null
     return clip;
}

AudioClip.java

@Component
public class AudioClip implements java.io.Serializable {

private java.math.BigDecimal id;
private java.lang.Integer    userId;
.....
}

从数据库中获取的对象包含创建此 db 对象的 userId。因此,只有他有资格访问该组件。如何比较returnObject.userId和登录系统的userid?

【问题讨论】:

  • 是的,我会改正的
  • 可以肯定的是,您的 PostAuthorize 注释,虽然看起来不错,但不会阻塞任何东西,对吧?如果是真的,你能尝试添加一个@PreAuthorize("denyAll"),如果它正确地分组@PreAuthorize("hasRole('ROLE_CAESAR_IMPERATOR')")(假设你没有这样的角色)并说出会发生什么?
  • 编辑原始问题以发布正确答案令人困惑。您摆脱了 # 这是问题所在,以及为什么首先发布它。我花了一段时间才弄清楚问题和解决方案的区别是什么。

标签: java spring spring-security spring-el spring-4


【解决方案1】:

@holmis,正如您所指出的,罪魁祸首是代码中的 # !这段代码

@PostAuthorize("returnObject!=null?returnObject.userId==principal.account.aid:true")

有效!

【讨论】:

  • 我还建议不要在 @PostAuthorize 中执行 null 检查,而是在方法中执行它并在那里抛出某种 NOT FOUND 错误,这样您就可以跳过 @PostAuthorize 检查空对象
【解决方案2】:

同样的事情,但我发现这比@vijay 的答案更好。

@PostAuthorize("returnObject == null ?: returnObject.userId == principal.account.aid")

6.5.14 The Elvis Operator

【讨论】:

    猜你喜欢
    • 2017-02-04
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多