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 天前
企业认证与安全体系(五):Spring Security + JWT + Redis 企业级认证实战
redis·安全·spring·spring security·jwt
消失的旧时光-19432 天前
企业认证与安全体系(四):企业登录认证流程全解析——JWT、Redis、Spring Security 如何协同工作?
redis·安全·spring·spring security·jwt
智研数智工坊3 天前
SpringBoot4.0.6 + Security7.x + JWT 最新完整实战|无状态权限认证、统一异常处理、可直接落地
java·spring boot·spring security·jwt·权限认证
段ヤシ.3 天前
回顾Java知识点,面试题汇总Day17(持续更新)
java·springboot·spring security·shiro·mybatis-plus·jdbctemplate·spring data jpa
梵得儿SHI7 天前
SpringCloud 进阶拓展:Spring Security OAuth2+JWT 微服务统一认证授权全实战|生产级方案 + 源码解析 + 踩坑实录
spring·spring cloud·微服务·spring security·jwt·oauth2·统一认证授权
Devin~Y13 天前
互联网大厂 Java 面试实录:JVM、Spring Boot、MyBatis、Redis、Kafka、Spring AI、K8s 全链路追问小Y
java·jvm·spring boot·redis·kafka·mybatis·spring security
小坏讲微服务17 天前
SpringBoot4.0整合Spring Security+MyBatis Plus完整权限框架实现
java·spring·mybatis·spring security·mybatis plus·springboot4.0
Cry丶1 个月前
架构师实战:Spring Authorization Server 落地企业级“无感” SSO(附设计映射与源码级接口剖析)
spring·spring security·oauth2.0·authorization·sso·无感登录
Devin~Y1 个月前
大厂Java面试实录:Spring Boot/Cloud + Redis/Kafka + JWT + RAG/Agent(小Y翻车版)
java·spring boot·redis·spring cloud·kafka·spring security·jwt
Devin~Y1 个月前
大厂 Java 面试实战:Spring Boot 微服务 + Redis 缓存 + Kafka 消息 + Kubernetes + RAG(小Y水货翻车记)
java·spring boot·redis·kafka·spring security·jwt·oauth2