2025-05-28 15:48:17 -06:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								= OAuth 2.0 Migrations
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								== Validate `typ` Header with `JwtTypeValidator`
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								If when following the 6.5 preparatory steps you set `validateTypes` to `false`, you can now remove it.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								You can also remove explicitly adding `JwtTypeValidator` to the list of defaults.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								For example, change this:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								[tabs]
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								======
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Java::
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								+
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								[source,java,role="primary"]
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								----
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								@Bean
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								JwtDecoder jwtDecoder() {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									NimbusJwtDecoder jwtDecoder = NimbusJwtDecoder.withIssuerLocation(location)
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        .validateTypes(false) <1>
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // ... your remaining configuration
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        .build();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									jwtDecoder.setJwtValidator(JwtValidators.createDefaultWithValidators(
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										new JwtIssuerValidator(location), JwtTypeValidator.jwt())); <2>
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return jwtDecoder;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								----
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Kotlin::
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								+
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								[source,kotlin,role="secondary"]
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								----
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								@Bean
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								fun jwtDecoder(): JwtDecoder {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    val jwtDecoder = NimbusJwtDecoder.withIssuerLocation(location)
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        .validateTypes(false) <1>
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // ... your remaining configuration
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        .build()
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    jwtDecoder.setJwtValidator(JwtValidators.createDefaultWithValidators(
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        JwtIssuerValidator(location), JwtTypeValidator.jwt())) <2>
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return jwtDecoder
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								----
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								======
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								<1> - Switch off Nimbus verifying the `typ`
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								<2> - Add the default `typ` validator
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								to this:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								[tabs]
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								======
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Java::
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								+
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								[source,java,role="primary"]
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								----
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								@Bean
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								JwtDecoder jwtDecoder() {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									NimbusJwtDecoder jwtDecoder = NimbusJwtDecoder.withIssuerLocation(location)
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // ... your remaining configuration <1>
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        .build();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									jwtDecoder.setJwtValidator(JwtValidators.createDefaultWithIssuer(location)); <2>
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return jwtDecoder;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								----
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Kotlin::
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								+
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								[source,kotlin,role="secondary"]
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								----
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								@Bean
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								fun jwtDecoder(): JwtDecoder {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    val jwtDecoder = NimbusJwtDecoder.withIssuerLocation(location)
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // ... your remaining configuration
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        .build()
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    jwtDecoder.setJwtValidator(JwtValidators.createDefaultWithIssuer(location)) <2>
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return jwtDecoder
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								----
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								======
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								<1> - `validateTypes` now defaults to `false`
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								<2> - `JwtTypeValidator#jwt` is added by all `createDefaultXXX` methods
							 
						 
					
						
							
								
									
										
										
										
											2025-06-03 12:19:56 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2025-06-04 13:35:31 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								== Provide an AuthenticationConverter to BearerTokenAuthenticationFilter
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								In Spring Security 7, `BearerTokenAuthenticationFilter#setBearerTokenResolver` and `#setAuthenticaionDetailsSource` are deprecated in favor of configuring those on `BearerTokenAuthenticationConverter`.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								The `oauth2ResourceServer` DSL addresses most use cases and you need to nothing.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								If you are setting a `BearerTokenResolver` or `AuthenticationDetailsSource` directly on `BearerTokenAuthenticationFilter` similar to the following:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								[tabs]
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								======
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Java::
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								+
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								[source,java,role="primary"]
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								----
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								BearerTokenAuthenticationFilter filter = new BearerTokenAuthenticationFilter(authenticationManager);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								filter.setBearerTokenResolver(myBearerTokenResolver);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								filter.setAuthenticationDetailsSource(myAuthenticationDetailsSource);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								----
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Kotlin::
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								+
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								[source,kotlin,role="secondary"]
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								----
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								val filter = BearerTokenAuthenticationFilter(authenticationManager)
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								filter.setBearerTokenResolver(myBearerTokenResolver)
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								filter.setAuthenticationDetailsSource(myAuthenticationDetailsSource)
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								----
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								======
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								you are encouraged to use `BearerTokenAuthenticationConverter` to specify both:
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								[tabs]
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								======
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Java::
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								+
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								[source,java,role="primary"]
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								----
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								BearerTokenAuthenticationConverter authenticationConverter =
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    new BearerTokenAuthenticationConverter();
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								authenticationConverter.setBearerTokenResolver(myBearerTokenResolver);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								authenticationConverter.setAuthenticationDetailsSource(myAuthenticationDetailsSource);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								BearerTokenAuthenticationFilter filter = new BearerTokenAuthenticationFilter(authenticationManager, authenicationConverter);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								----
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Kotlin::
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								+
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								[source,kotlin,role="secondary"]
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								----
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								val authenticationConverter = BearerTokenAuthenticationConverter()
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								authenticationConverter.setBearerTokenResolver(myBearerTokenResolver)
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								authenticationConverter.setAuthenticationDetailsSource(myAuthenticationDetailsSource)
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								val filter = BearerTokenAuthenticationFilter(authenticationManager, authenticationConverter)
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								----
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								======