Java Spring Security PermissionEvaluator:如何使用对象ID实现hasPermission方法?
Spring的安全性“hasPermission”方法有一个实现,它(如我所知)用于传递类名(targetType)和对象Id(Serializable) 因此,请您解释一下(至少在一般情况下)如何正确执行此实现? 我搜索了传递对象ID的示例,但没有找到任何(甚至在Spring的文档中) 在我的情况下,我想检查用户对我的一些类的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
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;
}
}