【问题标题】:Retrieving values from reactive mongodb based on Mono基于 Mono 从响应式 mongodb 中检索值
【发布时间】:2020-08-23 19:04:24
【问题描述】:

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

在前端通过 okta 服务器对用户进行身份验证后,它会获取一个令牌,该令牌必须在每个请求标头中用作承载令牌。

我现在正在开发的端点负责根据分配给该用户的组从反应式 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"
     }
]

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

【问题讨论】:

标签: spring spring-boot spring-webflux okta


【解决方案1】:

经过几次尝试,我终于通过从 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"] 的组值,我需要它就像没有 [ 的字符串列表一样或 ",

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-31
    • 2019-09-03
    • 2017-12-13
    相关资源
    最近更新 更多