我正在尝试编写一个通用的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派生的存储库中获取域类型的最佳方法是什么?
答案 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。这允许我们确定有问题的具体存储库并返回所需的权限名称