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

文章目录

      • 场景
      • 分析(EnableGlobalMethodSecurity)
      • 实现

场景

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 "校验权限通过";
    }

你可能感兴趣的:(java,security)