Skip to content

Commit 2830e97

Browse files
vaadin-botknoobie
andauthored
fix: allow access to SecurityContext for invalidated http session (#23004) (#23019)
Co-authored-by: Knoobie <Knoobie@gmx.de>
1 parent 68c37d7 commit 2830e97

File tree

2 files changed

+29
-5
lines changed

2 files changed

+29
-5
lines changed

vaadin-spring/src/main/java/com/vaadin/flow/spring/security/VaadinAwareSecurityContextHolderStrategy.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,17 @@ private Optional<SecurityContext> getFromVaadinSession() {
6868
if (session == null || session.getSession() == null) {
6969
return Optional.empty();
7070
}
71-
Object securityContext = session.getSession().getAttribute(
72-
HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY);
73-
if (securityContext instanceof SecurityContext) {
74-
return Optional.of((SecurityContext) securityContext);
75-
} else {
71+
try {
72+
Object securityContext = session.getSession().getAttribute(
73+
HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY);
74+
if (securityContext instanceof SecurityContext context) {
75+
return Optional.of(context);
76+
} else {
77+
return Optional.empty();
78+
}
79+
} catch (IllegalStateException ignored) {
80+
// Session throws IllegalStateException when accessing
81+
// attributes of an invalid session
7682
return Optional.empty();
7783
}
7884
}

vaadin-spring/src/test/java/com/vaadin/flow/spring/security/VaadinAwareSecurityContextHolderStrategyTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,22 @@ public void explicitUsedWhenNoSessionAvailable() {
6666
Assert.assertEquals(explicit,
6767
vaadinAwareSecurityContextHolderStrategy.getContext());
6868
}
69+
70+
@Test
71+
public void getContext_invalidateSession_getsThreadSecurityContext() {
72+
SecurityContext explicit = Mockito.mock(SecurityContext.class);
73+
vaadinAwareSecurityContextHolderStrategy.setContext(explicit);
74+
75+
VaadinSession vaadinSession = Mockito.mock(VaadinSession.class);
76+
HttpSession httpSession = Mockito.mock(HttpSession.class);
77+
Mockito.when(vaadinSession.getSession())
78+
.thenReturn(new WrappedHttpSession(httpSession));
79+
Mockito.doThrow(IllegalStateException.class).when(httpSession)
80+
.getAttribute(
81+
HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY);
82+
VaadinSession.setCurrent(vaadinSession);
83+
84+
Assert.assertEquals(explicit,
85+
vaadinAwareSecurityContextHolderStrategy.getContext());
86+
}
6987
}

0 commit comments

Comments
 (0)