Skip to content

Commit 31b4abc

Browse files
authored
Merge pull request #219 from InseeFr/devAuth
Dev auth
2 parents 8d5906a + c672960 commit 31b4abc

File tree

4 files changed

+109
-97
lines changed

4 files changed

+109
-97
lines changed

src/main/java/fr/insee/genesis/configuration/auth/security/OIDCSecurityConfig.java

Lines changed: 45 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,31 @@
44
import lombok.RequiredArgsConstructor;
55
import lombok.Setter;
66
import lombok.extern.slf4j.Slf4j;
7+
import org.springframework.beans.factory.annotation.Value;
78
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
89
import org.springframework.boot.context.properties.ConfigurationProperties;
910
import org.springframework.context.annotation.Bean;
1011
import org.springframework.context.annotation.Configuration;
1112
import org.springframework.core.convert.converter.Converter;
1213
import org.springframework.http.HttpMethod;
13-
import org.springframework.security.config.Customizer;
14+
import org.springframework.security.authentication.AuthenticationManager;
15+
import org.springframework.security.authentication.ProviderManager;
1416
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
1517
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
1618
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
1719
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
1820
import org.springframework.security.config.http.SessionCreationPolicy;
1921
import org.springframework.security.core.GrantedAuthority;
2022
import org.springframework.security.oauth2.jwt.Jwt;
23+
import org.springframework.security.oauth2.jwt.NimbusJwtDecoder;
2124
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter;
25+
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationProvider;
26+
import org.springframework.security.oauth2.server.resource.authentication.JwtIssuerAuthenticationManagerResolver;
2227
import org.springframework.security.web.SecurityFilterChain;
23-
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
2428

2529
import java.util.Collection;
2630
import java.util.Collections;
31+
import java.util.HashMap;
2732
import java.util.List;
2833
import java.util.Map;
2934

@@ -43,29 +48,36 @@ public class OIDCSecurityConfig {
4348
private final RoleConfiguration roleConfiguration;
4449
private final SecurityTokenProperties inseeSecurityTokenProperties;
4550

51+
@Value("${fr.insee.genesis.security.resourceserver.jwt.issuer-uri}")
52+
String issuerUri;
53+
54+
@Value("${fr.insee.genesis.security.resourceserver.dmz.jwt.issuer-uri}")
55+
String issuerUriDmz;
56+
4657
@Bean
47-
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
58+
public SecurityFilterChain filterChain(HttpSecurity http, JwtIssuerAuthenticationManagerResolver authenticationManagerResolver) throws Exception {
4859
http
4960
.csrf(AbstractHttpConfigurer::disable)
50-
.sessionManagement(sess -> sess.sessionCreationPolicy(SessionCreationPolicy.STATELESS));
51-
for (var pattern : whitelistMatchers) {
52-
http.authorizeHttpRequests(authorize ->
53-
authorize
54-
.requestMatchers(AntPathRequestMatcher.antMatcher(pattern)).permitAll()
55-
);
56-
}
57-
http
58-
.authorizeHttpRequests(configure -> configure
61+
.sessionManagement(sess -> sess.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
62+
.authorizeHttpRequests(authorize -> authorize
63+
// Whitelisted paths sans auth
64+
.requestMatchers(whitelistMatchers).permitAll()
65+
66+
// Secured reader-access paths
5967
.requestMatchers(HttpMethod.GET,"/questionnaires/**").hasRole(String.valueOf(ApplicationRole.READER))
6068
.requestMatchers(HttpMethod.GET,"/modes/**").hasRole(String.valueOf(ApplicationRole.READER))
6169
.requestMatchers(HttpMethod.GET,"/interrogations/**").hasRole(String.valueOf(ApplicationRole.READER))
6270
.requestMatchers(HttpMethod.GET,"/campaigns/**").hasRole(String.valueOf(ApplicationRole.READER))
71+
72+
//All others require authentication
6373
.anyRequest().authenticated()
6474
)
65-
.oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults()));
75+
.oauth2ResourceServer(
76+
oauth2 -> oauth2.authenticationManagerResolver(authenticationManagerResolver));
6677
return http.build();
6778
}
6879

80+
6981
@Bean
7082
JwtAuthenticationConverter jwtAuthenticationConverter() {
7183
JwtAuthenticationConverter jwtAuthenticationConverter = new JwtAuthenticationConverter();
@@ -75,6 +87,26 @@ JwtAuthenticationConverter jwtAuthenticationConverter() {
7587
}
7688

7789

90+
91+
@Bean
92+
public JwtIssuerAuthenticationManagerResolver authenticationManagerResolver() {
93+
final List<String> issuers = List.of(issuerUri,issuerUriDmz);
94+
Map<String, AuthenticationManager> authenticationManagers = new HashMap<>();
95+
96+
for (String issuer : issuers) {
97+
NimbusJwtDecoder jwtDecoder = NimbusJwtDecoder
98+
.withJwkSetUri(issuer + "/protocol/openid-connect/certs")
99+
.build();
100+
101+
JwtAuthenticationProvider provider = new JwtAuthenticationProvider(jwtDecoder);
102+
provider.setJwtAuthenticationConverter(jwtAuthenticationConverter());
103+
104+
AuthenticationManager manager = new ProviderManager(provider);
105+
authenticationManagers.put(issuer, manager);
106+
}
107+
return new JwtIssuerAuthenticationManagerResolver(authenticationManagers::get);
108+
}
109+
78110
Converter<Jwt, Collection<GrantedAuthority>> jwtGrantedAuthoritiesConverter() {
79111
return new Converter<Jwt, Collection<GrantedAuthority>>() {
80112
@Override

src/main/resources/application-test.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ fr.insee.genesis.oidc.auth-server-url=https://organisation.server.auth/auth
1616
fr.insee.genesis.oidc.realm=test-realm
1717
springdoc.swagger-ui.oauth.client-id=client-id-test
1818

19+
fr.insee.genesis.oidc.dmz.auth-server-url=https://organisation.server.auth/auth
20+
fr.insee.genesis.oidc.dmz.realm=test-realm-dmz
1921

2022
fr.insee.genesis.authentication = OIDC
2123

src/main/resources/application.properties

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ server.forward-headers-strategy=framework
2626
#--------------------------------------------------------------------------
2727
fr.insee.genesis.security.token.oidc-claim-role=realm_access.roles
2828
fr.insee.genesis.security.token.oidc-claim-username=name
29-
spring.security.oauth2.resourceserver.jwt.issuer-uri=${fr.insee.genesis.oidc.auth-server-url}/realms/${fr.insee.genesis.oidc.realm}
29+
fr.insee.genesis.security.resourceserver.jwt.issuer-uri=${fr.insee.genesis.oidc.auth-server-url}/realms/${fr.insee.genesis.oidc.realm}
30+
fr.insee.genesis.security.resourceserver.dmz.jwt.issuer-uri=${fr.insee.genesis.oidc.dmz.auth-server-url}/realms/${fr.insee.genesis.oidc.dmz.realm}
31+
3032
fr.insee.genesis.security.whitelist-matchers=/v3/api-docs/**,/swagger-ui/**,/swagger-ui.html,/actuator/**,/error,/,/health-check/**
3133
springdoc.swagger-ui.oauth.scopes=openid,profile,roles
3234

0 commit comments

Comments
 (0)