Ich habe einen Autorisierungsserver in .Net Core mit Identity Server 4 eingebaut ! Es funktioniert wie erwartet, um Clients und Ressourcen von Node Js und .Net zu autorisieren. Jetzt versuche ich, eine Java Spring Boot 2-API (jdk 1.8) als geschützte Ressource hinzuzufügen. Ich habe dieses Ziel mit der OAuth2-Bootdokumentation erreicht ! Bisher funktioniert alles gut. Jetzt muss ich die Ansprüche aus dem vom Autorisierungsserver generierten Zugriffstoken extrahieren. Dies ist ein Inhaber-Token vom Typ JWT. Die Implementierung, die ich dafür habe, ist die folgende:
@Configuration
@EnableResourceServer
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends ResourceServerConfigurerAdapter {
public String resourceId;
@Autowired
public SecurityConfiguration(@Value("${security.oauth2.resource.id}") String resourceId) {
this.resourceId = resourceId;
}
@Override
public void configure(ResourceServerSecurityConfigurer resources) {
resources.resourceId(this.resourceId);
}
@Override
public void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity
.csrf()
.disable()
.authorizeRequests()
.antMatchers("/swagger-ui.html", "/webjars/**", "/swagger-resources/**", "/**/api-docs/**", "/actuator/**")
.permitAll()
.and()
.authorizeRequests().anyRequest().fullyAuthenticated();
}
Das Problem ist, dass wenn ich versuche, auf die Ansprüche innerhalb eines Controllers zuzugreifen, diese nicht verfügbar sind. Ich habe die Standardmethode extractAuthentication von DefaultAccessTokenConverter innerhalb der Federsicherheit überprüft und ignoriert tatsächlich alle nicht standardmäßigen Ansprüche. Was mir in den Sinn kommt, ist die Erstellung eines neuen Konverters, der den DefaultAccessToken-Konverter wie folgt erweitert:
@Component
public class CustomAccessTokenConverter extends DefaultAccessTokenConverter {
@Override
public OAuth2Authentication extractAuthentication(Map<String, ?> claims) {
OAuth2Authentication authentication = super.extractAuthentication(claims);
authentication.setDetails(claims);
return authentication;
}
}
Aber ich habe nicht herausgefunden, wo ich diesen neuen Konverter einspeisen oder referenzieren soll.
Leider scheint die automatische Spring Boot-Konfiguration keine Möglichkeit zu bieten DefaultAccessTokenConverter
, den Standard-Token-Konverter zu ersetzen RemoteTokenServices
. Um den Konverter zu ersetzen, müssten Sie den RemoteTokenServices
standardmäßig erstellten ersetzen .
Wenn Ihr Konverter eine Bean ist, können Sie ihn auf Ihr eigenes RemoteTokenServices
Objekt setzen, das Sie dann aktivieren können ResourceServerSecurityConfigurer
(damit er OAuth2AuthenticationManager
hinter den Kulissen angewendet werden kann ):
@Configuration
@EnableResourceServer
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends ResourceServerConfigurerAdapter {
// ...
@Autowired
private ResourceServerProperties resource;
@Autowired
private CustomAccessTokenConverter customConverter;
@Override
public void configure(ResourceServerSecurityConfigurer resources) {
resources.tokenServices(customTokenServices());
// ..
}
private RemoteTokenServices customTokenServices() {
RemoteTokenServices services = new RemoteTokenServices();
services.setAccessTokenConverter(this.customConverter);
// configure based on .properties file
services.setCheckTokenEndpointUrl(this.resource.getTokenInfoUri());
services.setClientId(this.resource.getClientId());
services.setClientSecret(this.resource.getClientSecret());
return services;
}
// ..
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen