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

解码jwt时出错时不会发布AuthenticationEvent

司空修贤
2023-03-14

由于验证器失败,我无法捕捉在尝试解码Jwt时发生错误的身份验证失败事件。我使用的是Spring Security 5.2.1。请注意,当我根本不在“authorization”头中传递令牌时,我会捕捉到授权失败事件。我想必须对spring配置进行一些额外的配置。

引发的异常:

org.springframework.security.oauth2.core.OAuth2AuthenticationException: An 
error occurred while attempting to decode the Jwt: This aud claim does not 
contain configured audience

审计的实施如下所述:https://www.baeldung.com/spring-boot-authentication-audit

当前Spring Security配置:

@EnableWebSecurity
  public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

private static final OAuth2Error INVALID_AUDIENCE =
        new OAuth2Error(OAuth2ErrorCodes.INVALID_REQUEST,
                "This aud claim does not contain configured audience",
                "https://tools.ietf.org/html/rfc6750#section-3.1");


@Value("${spring.security.oauth2.claim-to-validate.audience}")
private String audience;

@Value("${spring.security.oauth2.claim-to-validate.scope}")
private String scope;

@Value("${spring.security.oauth2.resourceserver.jwt.public-key-location:#{null}}")
private RSAPublicKey publicKeyLocation;

@Value("${spring.security.oauth2.resourceserver.jwt.jwk-set-uri:#{null}}")
private String jwkSetUri;

@Value("${spring.security.oauth2.resourceserver.jwt.issuer-uri:#{null}}")
private String issuerUri;


@Override
protected void configure(HttpSecurity http) throws Exception {
            http
                    .authorizeRequests()
                    .antMatchers( "/v1/resource/**")
                    .hasAuthority("SCOPE_" + scope)
                    .and()
                    .oauth2ResourceServer()
                    .jwt();
}

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.inMemoryAuthentication();
}

@Bean
public JwtDecoder jwtDecoder() {
    final OAuth2TokenValidator<Jwt> withAudience = audienceValidator(audience);

    final JwtDecoder jwtDecoder;

    if (publicKeyLocation != null) {
        jwtDecoder = NimbusJwtDecoder.withPublicKey(publicKeyLocation).build();
    } else if (StringUtils.hasLength(jwkSetUri)) {
        jwtDecoder = NimbusJwtDecoder.withJwkSetUri(jwkSetUri).build();
    } else if (StringUtils.hasLength(issuerUri)) {
        jwtDecoder = JwtDecoders.fromOidcIssuerLocation(issuerUri);
    } else {
        throw new IllegalStateException(
                "Invalid OAuth2 configuration: provide value for any of " +
                        "'publicKeyLocation', 'jwkSetUri' or 'issuerUri'");
    }

    ((NimbusJwtDecoder) jwtDecoder).setJwtValidator(withAudience);

    return jwtDecoder;
}

OAuth2TokenValidator<Jwt> audienceValidator(String audience) {
    return jwt -> {
        Assert.notNull(jwt, "token cannot be null");

        final List<String> audiences = jwt.getAudience();

        return audiences.contains(audience) ?
                OAuth2TokenValidatorResult.success() :
                OAuth2TokenValidatorResult.failure(INVALID_AUDIENCE);
    };
}
}

共有1个答案

祁承望
2023-03-14

将Spring Security更新到5.3.0或更高版本,并在Spring Security Configuration中声明自定义AuthenticationEventPublisher bean,如下所示:

@Autowired
private ApplicationEventPublisher publisher;

@Bean
public AuthenticationEventPublisher authenticationEventPublisher() {
    final Properties properties = new Properties();
    properties.put(
        OAuth2AuthenticationException.class.getCanonicalName(),
        AuthenticationFailureBadCredentialsEvent.class.getCanonicalName());

    final DefaultAuthenticationEventPublisher eventPublisher = new DefaultAuthenticationEventPublisher(publisher);

    eventPublisher.setAdditionalExceptionMappings(properties);

    return eventPublisher;
}

请注意,在5.3.0中,您可以直接添加不带属性结构的映射。

如果你需要坚持5.2。然后使用此处指出的解决方法:https://github.com/spring-projects/spring-security/issues/7793

 类似资料:
  • 我正在codingbat上做一个编码练习,这就是我应该做的: 给定2个正int值,返回在10...20范围内的较大值,如果两者都不在该范围内,则返回0。 max1020(11、19)→ 19 max1020(19,11)→ 19 max1020(11,9)→ 11 max1020(9,21)→ 0 我的代码: 我不明白为什么它不起作用,它给了我这个错误:

  • 我在尝试验证类中的ECDSA签名时遇到此错误。错误代码为: 我在VerificationBox中调用这个方法。java类: 这是SDSGeneration.Signing: 我写了一个测试类来测试SDSGeneration.Signing代码和一切运行良好,签名和验证数据,但是在我的项目中导入和使用它时,会出现下面的错误。这是测试类代码:

  • 我已经在系统上安装并配置了ATG。我对发布服务器和生产服务器使用以下配置: 出版 HTTP端口:8180 HTTPS端口:8543 站点HTTP端口:8180 RMI端口:8861 DRP端口:8851 文件部署:8811 生产 HTTP端口:8080 HTTPS端口:8443 站点HTTP端口:8080 RMI端口:8860 DRP端口:8850 文件部署:8810 在运行我的生产服务器的之后,

  • 问题内容: 我从这里选择了最新的2.45.0 。遵循文档并使用以下命令启动集线器 并且,文件内容为: 而且,唯一的 到目前为止,一切看起来都很不错。在这里注册后,请查看控制台的屏幕截图 而且,当我尝试通过以下方式开始测试时,问题就开始了: 而且,它抛出: WebDriver.dll中发生类型’System.InvalidOperationException’的异常,但未在用户代码中处理 附加信息:

  • 我使用了最新的Selenium服务器,从这里开始是2.45.0。遵循文档并使用以下命令启动中心 并且,JSon文件内容是: 并且,唯一具有 在这之前,一切看起来都很好。在此处注册后,请查看控制台的屏幕截图 而且,当我试图开始测试时,问题就开始了: 它抛出: “系统”类型的例外。WebDriver中发生“InvalidOperationException”。dll,但未在用户代码中处理 附加信息:无

  • Apereo CAS单一登录发布了以下JWT。 我知道这是一个使用JWE标准的加密JWT。加密密钥如下所示。 签名秘密如下。 用于正确解码此JWT的java代码如下所示。 我试图在NetCore2.2中解码相同的JWT。代码如下。 我故意禁用了签名验证和任何其他类型的验证。然而,在JWT验证中,我有以下错误。 有效载荷似乎没有正确解码。到目前为止,很多谷歌搜索都没有给我结果。