由于验证器失败,我无法捕捉在尝试解码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);
};
}
}
将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验证中,我有以下错误。 有效载荷似乎没有正确解码。到目前为止,很多谷歌搜索都没有给我结果。