Spring security 带有数据库的CustomPermissionEvaluator

Spring security 带有数据库的CustomPermissionEvaluator,spring-security,Spring Security,带有数据库的CustomPermissionEvaluator。 在REST控制器或服务上,我想设置一个custim-Spring-Security@preauthorize,以便根据用户权限检查对方法的访问 用户权限是我的应用程序对特定资源(页面、服务等)的访问权限,由适应化服务调用数据库处理。。。。 它们不会加载到userDetails中 那么,我该如何配置CustomPermissionEvaluator,以及我需要在登录时加载权限还是可以在evaluator中调用我的服务 @Config

带有数据库的CustomPermissionEvaluator。 在REST控制器或服务上,我想设置一个custim-Spring-Security@preauthorize,以便根据用户权限检查对方法的访问

用户权限是我的应用程序对特定资源(页面、服务等)的访问权限,由适应化服务调用数据库处理。。。。 它们不会加载到userDetails中

那么,我该如何配置CustomPermissionEvaluator,以及我需要在登录时加载权限还是可以在evaluator中调用我的服务

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true, proxyTargetClass = true)
public class ContextSecurityConfiguration {

    @Bean
    public PermissionEvaluator functionPermissionEvaluator() {
        return new XxxPermissionEvaluator ();
    }

    @Bean
    protected DefaultMethodSecurityExpressionHandler defaultMethodSecurityExpressionHandler() {
        DefaultMethodSecurityExpressionHandler expressionHandler = new DefaultMethodSecurityExpressionHandler();
        expressionHandler.setPermissionEvaluator(this.functionPermissionEvaluator());
        return expressionHandler;
    }
}
评价者

@Component
public class XxxPermissionEvaluator implements PermissionEvaluator {

    @Autowired
    private ApplicationContext applicationContext;

    @Override
    public boolean hasPermission(Authentication authentication, Object entity, Object permission) {
        Optional<String> optionalUserId = SecurityUtils.getCurrentUserLogin(authentication);
        return optionalUserId.map(userId -> {
            EntityValidatorFactory entityValidatorFactory = applicationContext.getBean(EntityValidatorFactory.class);
            EntityValidator entityValidator = entityValidatorFactory.get(entity);
            return entityValidator.isUserAllowedToEntity(userId, entity, (String) permission);
        }).orElse(false);
    }

    @Override
    public boolean hasPermission(Authentication authentication, Serializable serializable, String s, Object o) {
        throw new PrimaClaimsRuntimeException("hasPermission is not implemented.");
    }
}
@组件
公共类XxxPermissionEvaluator实现PermissionEvaluator{
@自动连线
私有应用程序上下文应用程序上下文;
@凌驾
公共权限(身份验证、对象实体、对象权限){
可选optionalUserId=SecurityUtils.getCurrentUserLogin(身份验证);
返回optionalUserId.map(userId->{
EntityValidatorFactory EntityValidatorFactory=applicationContext.getBean(EntityValidatorFactory.class);
EntityValidator EntityValidator=entityValidatorFactory.get(实体);
返回entityValidator.isUserAllowedToEntity(用户ID、实体、(字符串)权限);
}).orElse(假);
}
@凌驾
公共布尔hasPermission(身份验证、可序列化、可序列化、字符串s、对象o){
抛出新的PrimaClaimsRuntimeException(“未实现hasPermission”);
}
}
我的pb是我的自定义计算器,它需要注入数据库服务。 或者在配置类中注入服务等有点奇怪。。。通过相同配置扫描其他位置


因此,调用服务是我在userDetail中加载登录权限的好方法吗?

这取决于,处理权限所需的数据在哪里。数据是数据库。但如果有必要,可以在用户登录inIt时加载和存储,您可以在应用程序中进行一些缓存。