Java 公共spring NoRepositoryBean基接口上的预授权问题

Java 公共spring NoRepositoryBean基接口上的预授权问题,java,spring,spring-security,spring-data,spring-data-jpa,Java,Spring,Spring Security,Spring Data,Spring Data Jpa,我正在尝试编写一个通用的SecurePagingAndSorting存储库,它将检查CRUD操作的安全性,以避免在所有JPA存储库中重复相同的预授权(使用不同的权限) 下面是一个简单的例子: @NoRepositoryBean public interface SecuredPagingAndSortingRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID>

我正在尝试编写一个通用的SecurePagingAndSorting存储库,它将检查CRUD操作的安全性,以避免在所有JPA存储库中重复相同的预授权(使用不同的权限)

下面是一个简单的例子:

@NoRepositoryBean
public interface SecuredPagingAndSortingRepository<T, ID extends Serializable>     extends PagingAndSortingRepository<T, ID> {

@Override
@PreAuthorize("hasPermission(#id, domainType, 'delete')) 
 void delete(ID id);

}
@NoRepositoryBean
公共接口SecuredPagingAndSortingRepository扩展了PagingAndSortingRepository{
@凌驾
@预授权(“hasPermission(#id,domainType,'delete'))
作废删除(ID);
}

现在这里的问题是domainType参数,因为这是一个通用接口,不能硬编码。从SecurePagingRepository派生的存储库中获取域类型的最佳方法是什么。

我看到的最佳解决方案是编写自己的接口实现
PermissionEvaluator
然后将其注入安全上下文,替换默认上下文


如果您尝试这种方式,扩展类
AclPermissionEvaluator
将为您节省大量Spring已经管理的代码,并确保向后兼容性。

我看到的最佳解决方案是编写自己的接口实现
PermissionEvaluator
,然后将其插入安全上下文中,替换默认的接口


如果您尝试这种方式,扩展类
AclPermissionEvaluator
将为您节省大量Spring已经管理的代码,并确保向后兼容性。

我最终决定了这个解决方案。PreAuthorize可以使用@character在Spel表达式中使用任何bean

@Override
@PreAuthorize("hasPermission(#id, @security.getDeletePermission(#id,#this.this))) 
void delete(ID id);    
}

因此,当调用“security”bean的getDeletePermission函数时,#this.this参数将转换为相关的SimpleParepository。这允许我们确定相关的具体存储库,并返回所需的权限名称,我最终决定了这个解决方案。PreAuthorize具有使用任何bean的功能n使用@字符的Spel表达式

@Override
@PreAuthorize("hasPermission(#id, @security.getDeletePermission(#id,#this.this))) 
void delete(ID id);    
}

因此,当调用“security”bean的getDeletePermission函数时,#this.this参数将转换为相关的SimpleParepository。这允许我们确定相关的具体存储库并返回所需的权限名称

我正在查看Spring security ACL,但我仍然看不到hasPermission泛型查询如何当AclPermissionEvaulator需要做它的事情时,上面的y可以填充domainType read for。似乎我仍然需要用hasPermission(#id,'org.company.MyDomainObject',delete)来污染每个存储库实现在上面的场景中,我可以看到泛型查询扩充正在进行中,但似乎还没有完成。@CCob例如,您可以对域类型使用自定义值(在超类中),然后在本例中的
hasPermission
方法中执行自定义逻辑。否则,调用
super.hasPermission(…)
以确保向后兼容性。我正在查看Spring Security ACL,但我仍然不知道上面的hasPermission通用查询如何在ACLPermissionEvaulator需要执行操作时填充读取的domainType。似乎我仍然需要使用hasPermission来污染每个存储库实现(#id,'org.company.MyDomainObject',delete)在上面的场景中,我可以看到通用查询扩充正在进行中,但似乎还没有完成。@CCob例如,您可以使用自定义值(在超类中)对于域类型,在这种情况下,请在
hasPermission
方法中执行自定义逻辑。否则,请调用
super.hasPermission(…)
,以确保向后兼容性。