问题描述
我正在基于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”]的组值,我需要它像没有 [或“ 或,