PreAuthorize问题在常见的Spring NoRepositoryBean基接口上

时间:2016-01-21 22:02:39

标签: java spring spring-security spring-data spring-data-jpa

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

以下是一个简单示例:

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

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

}

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我最终决定使用这个解决方案。 PreAuthorize具有使用@ character。

在Spel表达式中使用任何bean的功能
@Override
@PreAuthorize("hasPermission(#id, @security.getDeletePermission(#id,#this.this))) 
void delete(ID id);    
}

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