如何对子 属性 中包含的 ID 执行复杂的 @PreAuthorize 检查?

How to do a complicated @PreAuthorize check for an ID that is contained in child property?

根据这个很棒post

表明您可以使用以下方法将 URL ID 与用户 ID 匹配:

@PreAuthorize("hasRole('ROLE_ADMIN) or #authUser.id == #userId")

但是如果我需要检查 userId 是否与 authUser 的子项相匹配怎么办?

所以假设我有实体:

public class User {
 int id;
 @OneToMany(mappedBy = "owner")
 Set<Store> stores;
}

我想根据#userId == #authUser.ANY_ONE_OF_THE_STORES.id?

进行验证

您可以创建组件,例如

@Component
public class AuthComponent {
    public boolean hasPermission(User user, Long id) {
        // do whatever checks you want here
        return someResult;
    }
}

然后就可以像这样访问SPEL中的组件方法了

@PreAuthorize("@authComponent.hasPermission(#authUser, #userId)")

因为 SPEL 支持通过 @ 引用 bean docs