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