首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在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
代码运行次数:0
运行
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
代码运行次数:0
运行
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
代码运行次数:0
运行
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
代码运行次数:0
运行
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

复制
相关文章
使用openfeign传递oauth2令牌
通过RequestInterceptor拦截Feign请求并装填OAuth2 Token public class OAuth2FeignRequestInterceptor implements RequestInterceptor { private static final String AUTHORIZATION_HEADER = "Authorization"; private static final String BEARER_TOKEN_TYPE = "Bearer";
路过君
2020/06/19
1.6K0
python:如何从 URL 中快速提取域名?
有时候,我们要从一段很长的 URL 里面提取出域名。例如从https://www.kingname.info/2020/10/02/copy-from-ssh/,我需要获取的是kingname.info。
王图思睿
2021/06/16
9.1K0
D令牌:免费进行中…
2014年,您用什么工具为您的网站护航呢? DNSPod 免费为您开启D令牌,您信吗? D令牌每30秒变换一组动态密码,为帐号安全提供可靠保障。 密码,随变,安全,不随便。 【一个D令牌的自白】 自带安全基因,6位安全基因组  ——6位动态密码 嬗变,是保障安全的一种本能 ——密码每30秒动态变换 富有安全感,自信为每一个帐号安全护航 ——二次防护,双重保障 与安全为盟。我是你,DNSPod 账户安全的贴心小伙伴 我是D令牌 【DNSPod启动”D令牌免费令”】 一令用户放心:每30s随机生成的6位动态数字
腾讯云DNSPod团队
2023/05/04
2880
D令牌:免费进行中…
如何在 Linux 中从备份恢复 Crontab?
Crontab是Linux中一个常用的任务调度工具,用于在预定时间自动执行计划任务。有时候,我们可能会意外地删除或丢失了原始的Crontab配置文件,而没有备份。在这种情况下,如果我们有一个之前的Crontab备份文件,我们可以通过恢复备份文件来恢复任务调度。本文将详细介绍如何在Linux中从备份恢复Crontab。
网络技术联盟站
2023/06/25
4130
如何在 Linux 中从备份恢复 Crontab?
如何在 Linux 中从备份恢复 Crontab?
在深入讨论如何恢复Crontab之前,让我们先了解一下Crontab的备份方法。通常,我们可以使用以下命令来备份Crontab配置文件:
网络技术联盟站
2023/09/06
5300
如何在 Linux 中从备份恢复 Crontab?
从ceph对象中提取RBD中的指定文件
之前有个想法,是不是有办法找到rbd中的文件与对象的关系,想了很久但是一直觉得文件系统比较复杂,在fs 层的东西对ceph来说是透明的,并且对象大小是4M,而文件很小,可能在fs层进行了合并,应该很难找到对应关系,最近看到小胖有提出这个问题,那么就再次尝试了,现在就是把这个实现方法记录下来 这个提取的作用个人觉得最大的好处就是一个rbd设备,在文件系统层被破坏以后,还能够从rbd提取出文件,我们知道很多情况下设备的文件系统一旦破坏,无法挂载,数据也就无法读取,而如果能从rbd中提取出文件,这就是保证了即使文件系统损坏的情况下,数据至少不丢失
用户2772802
2018/08/06
4.9K0
Spring OAuth2 实现始终获取新的令牌
Spring基于OAuth2协议编写的spring-oauth2实现,是行业级的接口资源安全解决方案,我们可以基于该依赖配置不同客户端的不同权限来访问接口数据。
恒宇少年
2021/04/25
2.1K0
如何从内存提取LastPass中的账号密码
简介 首先必须要说,这并不是LastPass的exp或者漏洞,这仅仅是通过取证方法提取仍旧保留在内存中数据的方法。之前我阅读《内存取证的艺术》(The Art of Memory Forensics)时,其中有一章节就有讨论从浏览器提取密码的方法。当你使用标准的用户名/密码方式登录一个网页,通常会发送一个包含了你的用户名及密码的post请求,这些都是以明文方式发送(这里不过多讨论SSL,在SSL内部也是明文发送的)。 本文描述如何找到这些post请求并提取信息,当然如果你捕获到浏览器登录,这些方法就很实用。
FB客服
2018/02/09
5.7K0
如何从内存提取LastPass中的账号密码
分享一篇详尽的关于如何在 JavaScript 中实现刷新令牌的指南
刷新令牌允许用户无需重新进行身份验证即可获取新的访问令牌,从而确保更加无缝的身份验证体验。这是通过使用长期刷新令牌来获取新的访问令牌来完成的,即使原始访问令牌已过期也是如此。
前端达人
2023/08/31
3820
分享一篇详尽的关于如何在 JavaScript 中实现刷新令牌的指南
如何从 Debian 系统中的 DEB 包中提取文件?
DEB 包是 Debian 系统中常见的软件包格式,用于安装和管理软件。有时候,您可能需要从 DEB 包中提取特定的文件,以便查看其内容、修改或进行其他操作。本文将详细介绍如何从 Debian 系统中的 DEB 包中提取文件,并提供相应的示例。
网络技术联盟站
2023/06/08
3.5K0
如何从 Debian 系统中的 DEB 包中提取文件?
spring security oauth2授权服务刷新令牌报错UserDetailsService is required
5.PreAuthenticatedAuthenticationProvider 获取userdetails
路过君
2022/04/26
7210
git命令中带有特殊符号如@
使用带用户密码clone的方式: git clone https://username:password@remote 当username和password中含有特殊符号会导致出错, 因为为http的请求,所以需要将特殊符号encode成url格式的 java使用: String c = java.net.URLEncoder.encode(".","utf-8"); System.out.println(c); 源文档 <http://blog.csdn.net/qq1142003960/article/
千往
2018/01/24
2.1K0
提取binlog中的DDL
有时候需要审计看看谁执行了啥操作. 但很多环境是没得审计的. 这时候就可以通过解析binlog 得到ddl执行的记录了(审计dml套麻烦了).
大大刺猬
2023/05/26
7290
提取binlog中的DDL
【DB笔试面试511】如何在Oracle中写操作系统文件,如写日志?
可以利用UTL_FILE包,但是,在此之前,要注意设置好UTL_FILE_DIR初始化参数。
AiDBA宝典
2019/09/30
29K0
【DB笔试面试511】如何在Oracle中写操作系统文件,如写日志?
从信息安全到如何在DAX中实现for循环
比如在一些会议上要展示一些图表,如果仅仅是放一些数据,可能并不能起到很好的作用,如果把姓名全都放上,则又会泄露一些信息。
陈学谦
2021/12/08
1.6K0
从信息安全到如何在DAX中实现for循环
spring cloud 搭建oauth2授权服务 使用redis存储令牌
依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </de
路过君
2020/06/19
1.4K0
PHP 提取富文本中的全部图片(提取文章中的全部图片)
未经允许不得转载:肥猫博客 » PHP 提取富文本中的全部图片(提取文章中的全部图片)
超级小可爱
2023/02/20
2.2K0
还不会使用JWT格式化OAuth2令牌吗?
OAuth2默认的AccessToken是由DefaultAccessTokenConverter生成,是具有唯一性的UUID随机字符串,我们如果想要使用JWT来格式化AccessToken就需要使用JwtAccessTokenConverter来进行格式化,当然如果你有自己独特的业务可以自己实现AccessTokenConverter接口,并将实现类交付给IOC托管即可。
恒宇少年
2019/12/16
7820
OAuth2简化模式
OAuth 2.0 简化模式(Implicit Flow)是 OAuth 2.0 的一种授权方式,主要用于移动应用或 Web 应用中的前端客户端(例如 JavaScript 应用)的授权。
堕落飞鸟
2023/04/13
1.9K0
点击加载更多

相似问题

在WebFlux中从WebFilter获取HandlerMethod

16

Rails 4:从令牌响应中提取Oauth2参数?

12

发送带有帐户信息的图片,如accountID(ios)

10

如何在异步ServerWebExchangeMatcher中评估WebFilter?

16

从python中的抽搐中获取Oauth2令牌

17
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

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