首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在webfilter中从oauth2令牌中提取accountId

如何在webfilter中从oauth2令牌中提取accountId
EN

Stack Overflow用户
提问于 2021-05-12 22:21:54
回答 1查看 73关注 0票数 1

我在我的程序中使用webflux和oauth2安全(keycloack as UAA server),我想从oauth2 jwt中提取一些信息,并且我做得很好。但我需要在过滤器中获取一些信息。当我使用我的旧方法时,它在filter (WebFilter)中不起作用。有没有办法解析token并从中获取信息?我的方法正确吗?或者我应该使用springSecurityFilterChain而不是WebFilter来提取它?我想用url中的accountId检查令牌中的accountId,客户端使用过滤器发送。

我听到的是我提取accountId的代码,它在WebFilter中不起作用,但当我使用它的服务或控制器时,它就能起作用

代码语言:javascript
运行
AI代码解释
复制
  public class SecurityFilter implements WebFilter {
    
    
        @Override
        public Mono<Void> filter(ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) {
           ReactiveSecurityContextHolder.getContext().map(SecurityContext::getAuthentication).map(Principal::getName).filter((accountId) -> accountId.equals(clientAccountId)

.switchIfEmpty(Mono.error(new SystemException("401 ERROR")));;
          return webFilterChain.filter(serverWebExchange);
    
    }

Hear是我提取accountId的第二种方法:

代码语言:javascript
运行
AI代码解释
复制
public class SecurityFilter implements WebFilter {


    @Override
    public Mono<Void> filter(ServerWebExchange serverWebExchange, WebFilterChain webFilterChain) {
      serverWebExchange.getPrincipal().map(Principal::getName).filter((accountId) -> accountId.equals(clientAccountId). .switchIfEmpty(Mono.error(new SystemException("401 ERROR")));;
      return webFilterChain.filter(serverWebExchange);

}

我的安全配置是:

代码语言:javascript
运行
AI代码解释
复制
 @Bean
    SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
        http
                .authorizeExchange()
                .pathMatchers("/api/**").authenticated()
              //  .pathMatchers("/**").permitAll()
                .anyExchange().authenticated()
                .and()
                .exceptionHandling()
                .accessDeniedHandler(new HttpStatusServerAccessDeniedHandler(HttpStatus.BAD_REQUEST))
                .and()
                .oauth2ResourceServer()
                .jwt()
                .jwtAuthenticationConverter(grantedAuthoritiesExtractor());
        return http.build();
    }

我想我应该有另一个SecurityWebFilterChain方法来为我做这件事。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-17 00:11:04

你正在寻找这样的smth

代码语言:javascript
运行
AI代码解释
复制
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
    var clientAccountId = "clientId";
    return exchange.getPrincipal()
            .map(Principal::getName)
            .flatMap((accountId) -> {
                if (accountId.equals(clientAccountId) && exchange.getRequest().getPath().value().equals("/my/api")) {
                    return Mono.just(accountId);
                }
                return Mono.error(new IllegalArgumentException("401 ERROR"));
            })
            .flatMap(tokenJwt -> chain.filter(exchange))
            .onErrorResume(r -> {
                exchange.getResponse().setRawStatusCode(HttpStatus.UNAUTHORIZED.value());
                return exchange.getResponse().setComplete();
            });
}

注意:当你使用reactive的时候,直到你或者spring订阅了它,它才会被执行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67511688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文