微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决基于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”]的组值,我需要它像没有 [

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。