如何解决基于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 举报,一经查实,本站将立刻删除。