82 lines
3.3 KiB
Java
82 lines
3.3 KiB
Java
package de.szut.casino.security;
|
|
|
|
import org.springframework.context.annotation.Bean;
|
|
import org.springframework.context.annotation.Configuration;
|
|
import org.springframework.http.HttpMethod;
|
|
import org.springframework.security.config.Customizer;
|
|
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
|
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
|
|
import org.springframework.security.core.GrantedAuthority;
|
|
import org.springframework.security.core.authority.SimpleGrantedAuthority;
|
|
import org.springframework.security.core.session.SessionRegistry;
|
|
import org.springframework.security.core.session.SessionRegistryImpl;
|
|
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter;
|
|
import org.springframework.security.web.SecurityFilterChain;
|
|
import org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy;
|
|
import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy;
|
|
import org.springframework.security.web.session.HttpSessionEventPublisher;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
|
|
@Configuration
|
|
@EnableWebSecurity
|
|
class KeycloakSecurityConfig {
|
|
|
|
private final KeycloakLogoutHandler keycloakLogoutHandler;
|
|
|
|
KeycloakSecurityConfig(KeycloakLogoutHandler keycloakLogoutHandler) {
|
|
this.keycloakLogoutHandler = keycloakLogoutHandler;
|
|
}
|
|
|
|
@Bean
|
|
public SessionRegistry sessionRegistry() {
|
|
return new SessionRegistryImpl();
|
|
}
|
|
|
|
@Bean
|
|
protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
|
|
return new RegisterSessionAuthenticationStrategy(sessionRegistry());
|
|
}
|
|
|
|
@Bean
|
|
public HttpSessionEventPublisher httpSessionEventPublisher() {
|
|
return new HttpSessionEventPublisher();
|
|
}
|
|
|
|
|
|
@Bean
|
|
public SecurityFilterChain resourceServerFilterChain(HttpSecurity http) throws Exception {
|
|
http.csrf(csrf -> csrf
|
|
.ignoringRequestMatchers("/webhook")
|
|
)
|
|
.authorizeHttpRequests(auth -> auth
|
|
.requestMatchers(HttpMethod.POST, "/webhook").permitAll()
|
|
.requestMatchers("/swagger", "/swagger-ui/**", "/v3/api-docs/**", "/health").permitAll()
|
|
.anyRequest().authenticated()
|
|
)
|
|
.oauth2ResourceServer(spec -> spec.jwt(Customizer.withDefaults()));
|
|
|
|
return http.build();
|
|
}
|
|
|
|
@Bean
|
|
public JwtAuthenticationConverter jwtAuthenticationConverter() {
|
|
JwtAuthenticationConverter jwtAuthenticationConverter = new JwtAuthenticationConverter();
|
|
jwtAuthenticationConverter.setJwtGrantedAuthoritiesConverter(jwt -> {
|
|
List<GrantedAuthority> grantedAuthorities = new ArrayList<>();
|
|
|
|
Map<String, Object> realmAccess = jwt.getClaim("realm_access");
|
|
if (realmAccess != null && realmAccess.containsKey("roles")) {
|
|
List<String> roles = (List<String>) realmAccess.get("roles");
|
|
for (String role : roles) {
|
|
grantedAuthorities.add(new SimpleGrantedAuthority("ROLE_" + role));
|
|
}
|
|
}
|
|
|
|
return grantedAuthorities;
|
|
});
|
|
return jwtAuthenticationConverter;
|
|
}
|
|
}
|