spring security 方法安全@PreAuthorize实现从方法参数中获取数据并判断权限

spring security版本:6.4.12

注解中使用hasRole方法,不能从方法参数中获取角色key,需要实现PermissionEvaluator接口。

实现PermissionEvaluator

java 复制代码
/**
 * spring security自定义权限检查(hasPermission)
 * 检查token中是否有request中请求对象的权限
 *
 * 如@PreAuthorize("hasPermission(#c, 'write')")
 * #c对应参数targetDomainObject
 * 不需要传第一个参数authentication
 *
 * @author xgw
 * @since 2024-15-10
 */
@Slf4j
public class MyPermissionEvaluator implements PermissionEvaluator {
    @Override
    public boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission) {
        log.debug("判断权限:{}", permission);
        //todo 检查authentication中是否有targetDomainObject(参数)的权限

        //暂时全通过
        return true;
    }

    @Override
    public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission) {
        return false;
    }
}

配置自定义的PermissionEvaluator到springSecurity中

java 复制代码
@Bean
    static MethodSecurityExpressionHandler expressionHandler() {
        PermissionEvaluator permissionEvaluator = new MyPermissionEvaluator();
        final DefaultMethodSecurityExpressionHandler expressionHandler = new DefaultMethodSecurityExpressionHandler();
        expressionHandler.setPermissionEvaluator(permissionEvaluator);
        return expressionHandler;
    }

在controller中使用

java 复制代码
   @PreAuthorize("hasPermission(#vo, 'write')")
    @DeleteMapping("v2/role/user")
    public void deleteRole(
            @P("vo")@Valid @RequestBody DeleteRoleVO vo) {
        roleService.deleteRole(vo);
    }

vo会被传到MyPermissionEvaluator中判断权限

相关推荐
消失的旧时光-19431 天前
第十三课:权限系统如何设计?——RBAC 与 Spring Security 架构
java·架构·spring security·rbac
编程彩机10 天前
互联网大厂Java面试:从Spring Security到微服务架构场景解析
kafka·spring security·微服务架构·jwt·java面试·分布式追踪
编程彩机13 天前
互联网大厂Java面试:从Spring Security到消息队列的场景解析
消息队列·spring security·微服务架构·java面试·分布式系统
indexsunny14 天前
互联网大厂Java面试实战:从Spring Boot到微服务架构的三轮提问
java·spring boot·微服务·eureka·kafka·mybatis·spring security
Micro麦可乐15 天前
最新Spring Security实战教程(十五)快速集成 GitHub 与 Gitee 的社交登录
java·spring boot·spring·gitee·github·spring security·社交登陆
indexsunny16 天前
互联网大厂Java面试实战:Spring Boot与微服务在电商场景中的应用
java·spring boot·redis·微服务·kafka·spring security·电商
这儿有个昵称19 天前
Java大厂面试实录:从Spring MVC到微服务的技术深度探讨
java·redis·spring·mybatis·spring security·spring mvc·oauth2
qq_3181215921 天前
互联网大厂Java面试故事:在线教育微服务架构、缓存优化与AI智能教学全流程解析
java·spring boot·redis·微服务·kafka·spring security·在线教育
予枫的编程笔记24 天前
【Java进阶】Spring Security详解
java·spring security·security
indexsunny24 天前
互联网大厂Java面试实战:音视频场景中的Spring Boot与Kafka技术问答
java·spring boot·redis·面试·kafka·spring security·互联网大厂