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 方法安全 SpEL 注释在将 Spring-boot 升级到 3.2.2 后总是给出 401
这是 Spring Framework 的错误。
但今天我尝试了 Spring Boot 3.2.4。这个错误仍然存在。
Spring boot 3.1.10 可以工作。