当前位置: 首页 > 知识库问答 >
问题:

当jwt令牌无效时,主体对象为空

拓拔泉
2023-03-14

我正在使用spring security对使用jwt令牌的用户进行身份验证。
身份验证工作正常,当令牌格式错误或过期时,我将获得403 Http状态,如下配置所示:

 @Bean
public SecurityWebFilterChain securitygWebFilterChain(ServerHttpSecurity http) {
    return http
            .exceptionHandling()
            .authenticationEntryPoint((swe, e) -> {
                return Mono.fromRunnable(() -> {
                    swe.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); 
                });
            }).accessDeniedHandler((swe, e) -> {
                return Mono.fromRunnable(() -> {
                    swe.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
                });
            }).and()
            .csrf().disable()
            .formLogin().disable()
            .httpBasic().disable()
            .authenticationManager(authenticationManager)
            .securityContextRepository(securityContextRepository)
            .authorizeExchange()
            .pathMatchers(HttpMethod.OPTIONS).permitAll()
            .pathMatchers("/**").permitAll()
            .anyExchange().authenticated()
            .and().build();
}

但是,当我从spring security context使用主体或身份验证从jwt令牌获取用户信息时,如下面的代码所示:

@ResponseStatus(HttpStatus.OK)
@GetMapping("/me")
public Mono<ClientDTO> find(final Principal principal) {
    return this.clientService.findByMail(principal.getName());
}

如果令牌格式不正确或过期,我将从主体对象获得空指针异常和500https状态。

共有1个答案

邹正阳
2023-03-14
@ResponseStatus(HttpStatus.OK)
@GetMapping("/me")
public Mono<ClientDTO> find(final Principal principal) { 

if(principal!=null) return this.clientService.findByMail(principal.getName());
else throw new CustomTokenExpiredException();
}

并删除
.pathmatchers(“/**”).PermitAll()

 类似资料:
  • 我遵循本教程使用JWT令牌。令牌到期时间设置为仅5分钟,但如果我想在使用1分钟后使令牌无效,该怎么办?我希望能够对API进行调用,以删除我的令牌。 我正在使用Express和Node。 从我能收集到的信息来看,我的选择是拥有一个存储令牌的令牌db。当我想让我的令牌过期时,我会从DB中过期/删除该令牌。 我还看到人们随意地说“移除”物理硬盘空间中的令牌,但我无法找出令牌的物理存储位置,以便我移除它。

  • 当令牌类型为“at+jwt”时,我们在验证中得到错误: 这只发生在大于2.2.7的spring boot版本中,你知道如何在验证中设置允许的令牌类型吗?

  • 我正在使用Azure AD对spring boot应用程序进行用户身份验证。我创建了一个应用程序来获取登录用户的访问令牌(令牌创建者应用程序)。在此应用程序中,“/token”API从@RegisteredAuth2AuthorizedClient读取访问令牌,并返回与响应相同的令牌。 然后,我必须使用返回的令牌作为RESTAPI的承载令牌,用于具有相同客户端id和相同配置的另一个应用程序。 但当

  • 那么有人能告诉我如何避免这种情况吗?

  • 我有一系列配置为使用Spring Boot和Cloud OAuth2 SSO的微服务项目。它具有以下组件: Spring Boot 1.3.0 Spring Cloud Brixton。M3 auth server具有Spring Boot 1.2.7和Cloud Angel。SR4 Zuul代理(网关) 验证服务器 资源服务器 用户界面服务器 尤里卡服务器 基本流程是: 使用URL解析UI服务器

  • 定义的新集成密钥9xxx7e null 但仍然得到401的回应内容: