基于 Mono 从反应式 mongodb 中检索值

Retrieving values from reactive mongodb based on Mono

我正在构建一个基于 Spring 网关和 webflux 的应用程序,它与 okta 集成作为授权服务器。

前端使用 okta 服务器对用户进行身份验证后,它会获得一个令牌,每个请求都必须使用该令牌 header 作为承载令牌。

我现在正在开发的端点负责根据分配给该用户的组从反应式 mongodb 中检索与该经过身份验证的用户相关的所有菜单。

从 okta JWT 令牌中提取的用户组 is/are,之后我应该查询 select 与这些组相关的所有菜单。

问题是我无法使用提取的组名称来使用它从反应式查询 mongodb

@RequestMapping("/menus")
public Mono oauthUserInfo() {

    return ReactiveSecurityContextHolder.getContext().filter(c -> Objects.nonNull(c.getAuthentication()))
            .map(s -> s.getAuthentication().getAuthorities().stream().filter((g) ->g.getAuthority().startsWith("GR_")));
           
    }

访问上面的 endpint 正在检索经过身份验证的用户组,如下所示:

[
     {
        "authority": "GR_user"
     },
     {
        "authority": "GR_admin"
     }
]

我的主要问题是,如何使用它从我的反应式 mongodb 中使用 'in' 运算符检索相关菜单并检索 Flux< Menu >

经过多次尝试,我最终通过从 Bearer 令牌中提取组名称实现了我的目标,如下所示

@RequestMapping("/menu")
public Flux<Menu> newEndPoint(){

    return  ReactiveSecurityContextHolder.getContext().filter(c -> Objects.nonNull(c.getAuthentication())).cast(SecurityContextImpl.class)
            .map( a -> a.getAuthentication().getPrincipal()).cast(Jwt.class)
            .map( a -> a.getClaims().get("groups").toString().substring(1,a.getClaims().get("groups").toString().length()-1).replaceAll("\"",""))
            .map( a -> a.split(","))
            .flatMapIterable( a -> Arrays.asList(a))
            .flatMap( a -> customMenuRepository.findByGroup(a))
            ;
}

在第 2 次和第 3 次地图调用中完成的操作是由于获取如下组值 ["GR_user", "GR_admin"],我需要它作为列表没有 [",

的字符串