自定义security的权限验实现 @EnableGlobalMethodSecurity(prePostEnabled = true)

场景

security @EnableGlobalMethodSecurity(prePostEnabled = true)注解 支持自定义的方式实现权限验证, 下面展示一个实现方案。

分析(EnableGlobalMethodSecurity)

@EnableGlobalMethodSecurity 注解是spring security用来开启方法级别权限验证注解的注解, 可以控制。

prePostEnabled = true 用来开启@PreAuthorize 和 @PostAuthorize 注解,允许在方法上使用表达式定义安全规则。
securedEnabled = true 表示启用 @Secured 注解,允许在方法上使用 @Secured 注解定义基于角色的访问控制

我们使用SPEL的方式自定义实现权限控制,比如: @PreAuthorize(“@customPermission.hasPermission(‘system:user:create’)”) 代表着调用customPermission bean的hasPermission 返回true代表有权限,false没有权限。

实现

  1. 开启@PreAuthorize注解
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class DemoWebSecurityConfigurerAdapter {}
  1. 注册权限验证类
    /**
     * 自定义权限校验服务
     * */
    @Bean("customPermission")
    public SecurityPermissionService securityFrameworkService(PermissionApi permissionApi) {
        return new SecurityFrameworkServiceImpl(permissionApi);
    }

/**
 * @version V1.0
 * @author: carsonlius
 * @date: 2023/12/22 13:58
 * @company
 * @description
 */
@RequiredArgsConstructor
public class SecurityFrameworkServiceImpl implements SecurityPermissionService {

    private final PermissionApi permissionApi;

    @Override
    public boolean hasPermission(String permission) {
        return hasAnyPermissions(permission);
    }

    @Override
    public boolean hasAnyPermissions(String... permissions) {
        Long userId = SecurityFrameworkUtils.getLoginUserId();

        if (userId == null) {
            return false;
        }
        return permissionApi.hasAnyPermissions(userId, permissions);
    }
}
  1. 给需要验证的接口上添加@PreAuthorize注解
    @GetMapping("checkPermission")
    @PermitAll
    @PreAuthorize("@customPermission.hasPermission('system:user:create')")
    public Object sayHello2() {
        return "校验权限通过";
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值