Java Spring Security PermissionEvaluator:如何使用对象ID实现hasPermission方法?

Java Spring Security PermissionEvaluator:如何使用对象ID实现hasPermission方法?,java,spring,spring-boot,spring-security,spring-data-jpa,Java,Spring,Spring Boot,Spring Security,Spring Data Jpa,Spring的安全性“hasPermission”方法有一个实现,它(如我所知)用于传递类名(targetType)和对象Id(Serializable) 因此,请您解释一下(至少在一般情况下)如何正确执行此实现? 我搜索了传递对象ID的示例,但没有找到任何(甚至在Spring的文档中) 在我的情况下,我想检查用户对我的一些类的DELETE权限(例如,“Goal”)。所有这些类都有通用方法和字段,因此我可以在PermissionEvaluator中使用通用逻辑来检查权限 为此,我打算将对象的ID

Spring的安全性“hasPermission”方法有一个实现,它(如我所知)用于传递类名(targetType)和对象Id(Serializable)

因此,请您解释一下(至少在一般情况下)如何正确执行此实现? 我搜索了传递对象ID的示例,但没有找到任何(甚至在Spring的文档中)

在我的情况下,我想检查用户对我的一些类的
DELETE
权限(例如,“Goal”)。所有这些类都有通用方法和字段,因此我可以在
PermissionEvaluator
中使用通用逻辑来检查权限

为此,我打算将对象的ID和对象的类名传递给PermissionEvaluator,并在此处进行如下检查:

@PreAuthorize("hasPermission(#id, 'Goal','DELETE')")
在实现之前,这听起来相当不错,因为我真的不明白如何在权限计算器中通过类名和Id获得对象的实例

@Component
public class CustomPermissionEvaluator implements PermissionEvaluator 

 @Override
    public boolean hasPermission(Authentication authentication, Serializable serializable, String targetType,
                                 Object permission) {
是的,我可以通过
Class.forName(targetType)
实例化对象,但是如何通过
Id(可序列化)
从适当的存储库获取它的实例呢?(我对每个对象都有不同的存储库)。
@Autowiring
我的30个存储库都将是疯狂的。

实现了我的服务,它获取对象ID和对象类型,然后发回对象,我可以稍后取消绑定。我使用了动态HQL,因此不需要在30+JPA存储库中进行自动连接(糟糕的是,我一开始就错过了这种可能性)


    @PersistenceContext
    EntityManager entityManager;

    static String entityClassPath="com.platform.entity.";

    public Object getEntity(String className, Long id) {

        String classToQuery = capitalize(className);

        /* Check if Entity class exists to decide whether to query DB or not */
        try {
            Class cls = Class.forName(entityClassPath + className);
        } catch (Exception e) {
            return null;
        }

        /* Query DB if Entity class exist */
        Query query;
        try {
            query = entityManager.createQuery("SELECT Q FROM " + classToQuery + " Q WHERE Q.id=?1");
            query.setParameter(1, id);
            return query.getSingleResult();
        } catch (Exception e) {
                e.printStackTrace();
                return null;
        }
    }