Spring SPEL对象引用未能"取消引用"方法输入参数对象

时间:2016-05-31 17:13:04

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

我正在使用具有ACL级别权限的Spring Security(版本4.0.3.RELEASE) - 我正在尝试使用@PreAuthorize将PreAuthorize ACL的权限应用于我的CrudRepository接口中的delete方法通过调用SPEL方法" hasPermission" (见下文)。 hasPermission使用我在几个论坛,教程和参考文档中看到的哈希表示法引用输入参数,但是输入参数(我要删除的对象)没有被SPEL解析器拾取或支持框架。所以,换句话说,我想删除名为" apiKey"的对象。这是下面的输入参数。我使用"#apiKey"在SPEL注释中引用它。但是当我在方法org.springframework.security.acls.AclPermissionEvaluator.hasPermission(...)中放置一个断点时," domainObject" input参数为NULL。

我对Spring和ACL很陌生,所以我必须做一些根本错误的事情。我已经尝试在Spring SPEL Parser中放置断点并在运行时间内完成,但是我找不到基于SPEL令牌解析反射参数的代码片段。我认为它是隐藏的"用本地方法或其他东西。

我也试过摆弄SPEL参考语法。似乎没有其他东西正确解析,所以我认为"#argument_name"是正确的语法 - 它只是SPEL无法取消引用参数对象。

我的CrudRepository代码w /对象引用(" #apiKey")不起作用:

public interface ApiKeyRepository extends CrudRepository<ApiKey, Long> {
    @Override
    @PreAuthorize("hasPermission(#apiKey, 'DELETE')")
    void delete(ApiKey apiKey);
}

应该接收我的apiKey对象的Spring安全代码,而是获取domainObject的NULL值:

public class AclPermissionEvaluator implements PermissionEvaluator {
    ...
    public boolean hasPermission(Authentication authentication, Object domainObject, Object permission) {
        if (domainObject == null) {
            return false; //<== This is where I'm getting access denied from
        }
        ...

关于为什么SPEL无法通过apiKey输入参数正确引用的任何想法?提前谢谢。

1 个答案:

答案 0 :(得分:0)

由于引用THIS POST THIS DOC的{{3}},我想出了我的问题 显然,如果不在arg上使用@Param注释,则无法在接口中对方法参数进行对象引用。所以,这是我更新的代码解决了这个问题:

public interface ApiKeyRepository extends CrudRepository<ApiKey, Long> {
    @Override
    @PreAuthorize("hasPermission(#apiKey, 'DELETE')")
    void delete(@Param("apiKey") ApiKey apiKey);
}