Spring Boot Webflux @PrePreAuthorize 与 SpEL 保持传递空值

问题描述 投票:0回答:1

Spring boot 3.2.2 + Webflux 安全

我尝试通过 ReactiveMethodSecurity 构建自定义 @PreAuthorize。

此代码检查用户对“空间”的授权

@Component(value = "SpaceAccess")
@RequiredArgsConstructor
@Slf4j
public class SpaceAccessValidation {

    public final Mono<Boolean> readable(String spaceId){
        log.info("spaceId: {}", spaceId);
        Mono<Boolean> access = AuthUtils.getMemberDetailsMono()
                .map(memberDetails -> memberDetails.spaces()
                        .stream()
                        .anyMatch(o -> StringUtils.equals(o.id(), spaceId) && o.role().readable))
                .switchIfEmpty(AuthUtils.getAccessId()
                        .flatMap(accessId -> compareSpaceMemberRoleLevel(spaceId, accessId, SpaceRoleType.VIEWER))
                );
        return Mono.zip(access, spaceExist(spaceId), (a, b) -> a && b);
    }
}

AuthUtils 只是从 ReactiveSecurityContextHolder 中引入主体。

问题在于,当 RestController 执行此方法时,传递的参数 spaceId 为 null。

@RestController
@RequestMapping("search/spaces/{spaceId}")
public class SearchRestController {


    @GetMapping("memos")
    @PreAuthorize("@SpaceAccess.readable(#spaceId)")
    @ResponseStatus(HttpStatus.OK)
    public Mono<PagingResultRecord> findMemos(@PathVariable(name = "spaceId") String spaceId){

        //call method
    }
}

当我调用此 api SpEL #spaceId 时,不断传递 null 值。

我认为#spaceId是正确的表达。你有什么想法吗?

我检查了stackoverflow和SpEL表达式文档中的几个问题。 但到处都说当我动态传递参数时 #variable 是正确的。

spring-security spring-webflux spring-el pre-authentication
1个回答
0
投票

自我回答:

Spring 方法安全 SpEL 注释在将 Spring-boot 升级到 3.2.2 后总是给出 401

这是 Spring Framework 的错误。

但今天我尝试了 Spring Boot 3.2.4。这个错误仍然存在。

Spring boot 3.1.10 可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.