Skip to content

Commit a0f578f

Browse files
Lauris Kaplinskisvenzik
authored andcommitted
Upgrade to Spring Boot 3/Spring Security 6
Signed-off-by: Lauris Kaplinski <[email protected]>
1 parent 667fe0e commit a0f578f

File tree

16 files changed

+107
-56
lines changed

16 files changed

+107
-56
lines changed

example/.github/workflows/maven-build.yml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,19 @@ jobs:
77
runs-on: ubuntu-latest
88

99
steps:
10-
- uses: actions/checkout@v3
10+
- uses: actions/checkout@v4
1111

12-
- uses: actions/setup-java@v3
12+
- uses: actions/setup-java@v4
1313
with:
1414
distribution: zulu
15-
java-version: 11
15+
java-version: 17
1616

1717
- name: Cache Maven packages
18-
uses: actions/cache@v3
18+
uses: actions/cache@v4
1919
with:
2020
path: ~/.m2
21-
key: ${{ runner.os }}-m2-v11-${{ secrets.CACHE_VERSION }}-${{ hashFiles('**/pom.xml') }}
22-
restore-keys: ${{ runner.os }}-m2-v11-${{ secrets.CACHE_VERSION }}
21+
key: ${{ runner.os }}-m2-v17-${{ secrets.CACHE_VERSION }}-${{ hashFiles('**/pom.xml') }}
22+
restore-keys: ${{ runner.os }}-m2-v17-${{ secrets.CACHE_VERSION }}
2323

2424
- name: Build
2525
run: mvn --batch-mode compile

example/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ You can specify the profile as a command-line argument to the Maven wrapper comm
4949

5050
### 5. Run the application
5151

52-
Spring Boot web applications can be run from the command-line. You need to have the Java Development Kit 8 installed for building the application package and running the application.
52+
Spring Boot web applications can be run from the command-line. You need to have the Java Development Kit 17 installed for building the application package and running the application.
5353

5454
Build and run the application with the following command in a terminal window:
5555

example/pom.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<groupId>org.springframework.boot</groupId>
77
<artifactId>spring-boot-starter-parent</artifactId>
8-
<version>2.7.15</version>
8+
<version>3.1.9</version>
99
<relativePath/> <!-- lookup parent from repository -->
1010
</parent>
1111
<groupId>org.webeid.example</groupId>
@@ -17,10 +17,10 @@
1717
</description>
1818

1919
<properties>
20-
<java.version>11</java.version>
20+
<java.version>17</java.version>
2121
<maven-surefire-plugin.version>2.22.1</maven-surefire-plugin.version>
2222
<webeid.version>3.0.0</webeid.version>
23-
<digidoc4j.version>5.2.0</digidoc4j.version>
23+
<digidoc4j.version>5.3.0</digidoc4j.version>
2424
<jmockit.version>1.44</jmockit.version>
2525
</properties>
2626

example/src/main/java/eu/webeid/example/config/ApplicationConfiguration.java

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -24,53 +24,52 @@
2424

2525
import eu.webeid.example.security.AuthTokenDTOAuthenticationProvider;
2626
import eu.webeid.example.security.WebEidAjaxLoginProcessingFilter;
27+
import org.springframework.context.annotation.Bean;
2728
import org.springframework.context.annotation.Configuration;
28-
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
29-
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
29+
import org.springframework.security.authentication.AuthenticationManager;
30+
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
31+
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
3032
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
3133
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
32-
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
34+
import org.springframework.security.web.SecurityFilterChain;
3335
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
3436
import org.springframework.security.web.authentication.logout.HttpStatusReturningLogoutSuccessHandler;
37+
import org.springframework.security.web.context.HttpSessionSecurityContextRepository;
38+
import org.springframework.security.web.context.SecurityContextRepository;
3539
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
3640
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
3741

3842
@Configuration
3943
@EnableWebSecurity
40-
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)
41-
public class ApplicationConfiguration extends WebSecurityConfigurerAdapter implements WebMvcConfigurer {
44+
@EnableMethodSecurity(securedEnabled = true, jsr250Enabled = true)
45+
public class ApplicationConfiguration implements WebMvcConfigurer {
4246
final AuthTokenDTOAuthenticationProvider authTokenDTOAuthenticationProvider;
47+
final SecurityContextRepository securityContextRepository;
4348

4449
public ApplicationConfiguration(AuthTokenDTOAuthenticationProvider authTokenDTOAuthenticationProvider) {
4550
this.authTokenDTOAuthenticationProvider = authTokenDTOAuthenticationProvider;
51+
this.securityContextRepository = new HttpSessionSecurityContextRepository();
4652
}
4753

48-
@Override
49-
protected void configure(AuthenticationManagerBuilder authenticationManagerBuilder) {
50-
authenticationManagerBuilder.authenticationProvider(authTokenDTOAuthenticationProvider);
54+
@Bean
55+
public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {
56+
return authenticationConfiguration.getAuthenticationManager();
5157
}
5258

53-
@Override
54-
protected void configure(HttpSecurity http) throws Exception {
55-
// @formatter:off
56-
http
57-
.addFilterBefore(
58-
new WebEidAjaxLoginProcessingFilter("/auth/login", authenticationManager()),
59-
UsernamePasswordAuthenticationFilter.class)
60-
.authorizeRequests()
61-
.antMatchers("/auth/challenge", "/auth/login", "/")
62-
.permitAll()
63-
.antMatchers("/welcome")
64-
.authenticated()
65-
.and()
66-
.logout()
67-
.logoutSuccessHandler(new HttpStatusReturningLogoutSuccessHandler())
68-
.and()
69-
.headers()
70-
.frameOptions().sameOrigin();
71-
// @formatter:on
59+
@Bean
60+
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
61+
AuthenticationManager manager = authenticationManager(http.getSharedObject(AuthenticationConfiguration.class));
62+
63+
return http
64+
.authenticationProvider(authTokenDTOAuthenticationProvider)
65+
.addFilterBefore(new WebEidAjaxLoginProcessingFilter("/auth/login", manager, securityContextRepository),
66+
UsernamePasswordAuthenticationFilter.class)
67+
.logout(logout -> logout.logoutSuccessHandler(new HttpStatusReturningLogoutSuccessHandler()))
68+
.headers(headers -> headers.frameOptions(options -> options.sameOrigin()))
69+
.build();
7270
}
7371

72+
@Override
7473
public void addViewControllers(ViewControllerRegistry registry) {
7574
registry.addViewController("/").setViewName("index");
7675
registry.addViewController("/welcome").setViewName("welcome");

example/src/main/java/eu/webeid/example/config/SessionBackedChallengeNonceStore.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import eu.webeid.security.challenge.ChallengeNonce;
2727
import eu.webeid.security.challenge.ChallengeNonceStore;
2828

29-
import javax.servlet.http.HttpSession;
29+
import jakarta.servlet.http.HttpSession;
3030

3131
public class SessionBackedChallengeNonceStore implements ChallengeNonceStore {
3232

example/src/main/java/eu/webeid/example/config/ValidationConfiguration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
import eu.webeid.security.validator.AuthTokenValidator;
3838
import eu.webeid.security.validator.AuthTokenValidatorBuilder;
3939

40-
import javax.servlet.http.HttpSession;
40+
import jakarta.servlet.http.HttpSession;
4141
import java.io.IOException;
4242
import java.io.InputStream;
4343
import java.net.URI;

example/src/main/java/eu/webeid/example/security/WebEidAjaxLoginProcessingFilter.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,35 +24,42 @@
2424

2525
import com.fasterxml.jackson.databind.ObjectMapper;
2626
import java.io.IOException;
27-
import javax.servlet.http.HttpServletRequest;
28-
import javax.servlet.http.HttpServletResponse;
27+
import jakarta.servlet.http.HttpServletRequest;
28+
import jakarta.servlet.http.HttpServletResponse;
2929

3030
import eu.webeid.example.security.ajax.AjaxAuthenticationFailureHandler;
3131
import eu.webeid.example.security.ajax.AjaxAuthenticationSuccessHandler;
3232
import eu.webeid.example.security.dto.AuthTokenDTO;
33+
import jakarta.servlet.FilterChain;
34+
import jakarta.servlet.ServletException;
3335
import org.slf4j.Logger;
3436
import org.slf4j.LoggerFactory;
3537
import org.springframework.http.HttpMethod;
3638
import org.springframework.security.authentication.AuthenticationManager;
3739
import org.springframework.security.authentication.AuthenticationServiceException;
3840
import org.springframework.security.core.Authentication;
3941
import org.springframework.security.core.AuthenticationException;
42+
import org.springframework.security.core.context.SecurityContextHolder;
4043
import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;
4144
import org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken;
4245
import org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy;
46+
import org.springframework.security.web.context.SecurityContextRepository;
4347

4448
public class WebEidAjaxLoginProcessingFilter extends AbstractAuthenticationProcessingFilter {
4549
private static final Logger LOG = LoggerFactory.getLogger(WebEidAjaxLoginProcessingFilter.class);
50+
private final SecurityContextRepository securityContextRepository;
4651

4752
public WebEidAjaxLoginProcessingFilter(
4853
String defaultFilterProcessesUrl,
49-
AuthenticationManager authenticationManager
54+
AuthenticationManager authenticationManager,
55+
SecurityContextRepository securityContextRepository
5056
) {
5157
super(defaultFilterProcessesUrl);
5258
this.setAuthenticationManager(authenticationManager);
5359
this.setAuthenticationSuccessHandler(new AjaxAuthenticationSuccessHandler());
5460
this.setAuthenticationFailureHandler(new AjaxAuthenticationFailureHandler());
5561
setSessionAuthenticationStrategy(new SessionFixationProtectionStrategy());
62+
this.securityContextRepository = securityContextRepository;
5663
}
5764

5865
@Override
@@ -76,4 +83,10 @@ public Authentication attemptAuthentication(HttpServletRequest request, HttpServ
7683
LOG.info("attemptAuthentication(): Calling authentication manager");
7784
return getAuthenticationManager().authenticate(token);
7885
}
86+
87+
@Override
88+
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException {
89+
super.successfulAuthentication(request, response, chain, authResult); // Generated from nbfs://nbhost/SystemFileSystem/Templates/Classes/Code/OverriddenMethodBody
90+
securityContextRepository.saveContext(SecurityContextHolder.getContext(), request, response);
91+
}
7992
}

example/src/main/java/eu/webeid/example/security/ajax/AjaxAuthenticationFailureHandler.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@
2727
import org.springframework.security.core.AuthenticationException;
2828
import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler;
2929

30-
import javax.servlet.http.HttpServletRequest;
31-
import javax.servlet.http.HttpServletResponse;
32-
import javax.servlet.http.HttpSession;
30+
import jakarta.servlet.http.HttpServletRequest;
31+
import jakarta.servlet.http.HttpServletResponse;
32+
import jakarta.servlet.http.HttpSession;
3333
import java.io.IOException;
3434

3535
public class AjaxAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler {

example/src/main/java/eu/webeid/example/security/ajax/AjaxAuthenticationSuccessHandler.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@
2929
import java.util.Collection;
3030
import java.util.List;
3131
import java.util.stream.Collectors;
32-
import javax.servlet.http.HttpServletRequest;
33-
import javax.servlet.http.HttpServletResponse;
32+
import jakarta.servlet.http.HttpServletRequest;
33+
import jakarta.servlet.http.HttpServletResponse;
3434
import org.slf4j.Logger;
3535
import org.slf4j.LoggerFactory;
3636
import org.springframework.security.core.Authentication;

example/src/main/java/eu/webeid/example/service/SigningService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@
4646
import org.springframework.core.io.ByteArrayResource;
4747
import org.springframework.stereotype.Service;
4848

49-
import javax.servlet.http.HttpSession;
50-
import javax.xml.bind.DatatypeConverter;
49+
import jakarta.servlet.http.HttpSession;
50+
import jakarta.xml.bind.DatatypeConverter;
5151
import java.io.IOException;
5252
import java.io.InputStream;
5353
import java.security.NoSuchAlgorithmException;

0 commit comments

Comments
 (0)