Skip to content

Commit 6252751

Browse files
committed
fix for #818
1 parent c96ebcc commit 6252751

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
1010
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
1111
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
12+
import org.springframework.security.config.http.SessionCreationPolicy;
13+
import org.springframework.security.core.session.SessionRegistry;
14+
import org.springframework.security.core.session.SessionRegistryImpl;
1215
import org.springframework.security.core.userdetails.UserDetailsService;
1316
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
1417
import org.springframework.security.crypto.password.PasswordEncoder;
@@ -44,6 +47,11 @@ public PasswordEncoder passwordEncoder() {
4447

4548
@Autowired private FirstLoginFilter firstLoginFilter;
4649

50+
@Bean
51+
public SessionRegistry sessionRegistry() {
52+
return new SessionRegistryImpl();
53+
}
54+
4755
@Bean
4856
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
4957
http.addFilterBefore(userAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
@@ -53,6 +61,14 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
5361
http.csrf(csrf -> csrf.disable());
5462
http.addFilterBefore(rateLimitingFilter(), UsernamePasswordAuthenticationFilter.class);
5563
http.addFilterAfter(firstLoginFilter, UsernamePasswordAuthenticationFilter.class);
64+
http.sessionManagement(
65+
sessionManagement ->
66+
sessionManagement
67+
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
68+
.maximumSessions(3)
69+
.maxSessionsPreventsLogin(true)
70+
.sessionRegistry(sessionRegistry())
71+
.expiredUrl("/login?logout=true"));
5672
http.formLogin(
5773
formLogin ->
5874
formLogin

src/main/java/stirling/software/SPDF/controller/api/UserController.java

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
import org.springframework.http.ResponseEntity;
1111
import org.springframework.security.access.prepost.PreAuthorize;
1212
import org.springframework.security.core.Authentication;
13+
import org.springframework.security.core.session.SessionInformation;
14+
import org.springframework.security.core.session.SessionRegistry;
15+
import org.springframework.security.core.userdetails.UserDetails;
1316
import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler;
1417
import org.springframework.stereotype.Controller;
1518
import org.springframework.ui.Model;
@@ -228,11 +231,27 @@ public String deleteUser(@PathVariable String username, Authentication authentic
228231
if (currentUsername.equals(username)) {
229232
throw new IllegalArgumentException("Cannot delete currently logined in user.");
230233
}
231-
234+
invalidateUserSessions(username);
232235
userService.deleteUser(username);
233236
return "redirect:/addUsers";
234237
}
235238

239+
@Autowired private SessionRegistry sessionRegistry;
240+
241+
private void invalidateUserSessions(String username) {
242+
for (Object principal : sessionRegistry.getAllPrincipals()) {
243+
if (principal instanceof UserDetails) {
244+
UserDetails userDetails = (UserDetails) principal;
245+
if (userDetails.getUsername().equals(username)) {
246+
for (SessionInformation session :
247+
sessionRegistry.getAllSessions(principal, false)) {
248+
session.expireNow();
249+
}
250+
}
251+
}
252+
}
253+
}
254+
236255
@PreAuthorize("!hasAuthority('ROLE_DEMO_USER')")
237256
@PostMapping("/get-api-key")
238257
public ResponseEntity<String> getApiKey(Principal principal) {

0 commit comments

Comments
 (0)