我正在使用具有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输入参数正确引用的任何想法?提前谢谢。