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

问题描述

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

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

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

用户组是从okta JWT令牌中提取的,此后,我应该查询选择与这些组相关的所有菜单

问题是我无法使用提取的组名来将其用于从反应式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"
     }
]

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

解决方法

经过几番尝试,终于通过如下从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”]的组值,我需要它像没有 [