场景
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没有权限。
实现
- 开启@PreAuthorize注解
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class DemoWebSecurityConfigurerAdapter {}
- 注册权限验证类
/**
* 自定义权限校验服务
* */
@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);
}
}
- 给需要验证的接口上添加@PreAuthorize注解
@GetMapping("checkPermission")
@PermitAll
@PreAuthorize("@customPermission.hasPermission('system:user:create')")
public Object sayHello2() {
return "校验权限通过";
}