Skip to content

Commit edafc78

Browse files
committed
Merge pull request #41278 from Chu3laMan
* pr/41278: Polish "Publish an AuditEvent on logout" Publish an AuditEvent on logout Closes gh-41278
2 parents 5689bf5 + 0ce3420 commit edafc78

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/security/AuthenticationAuditListener.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.springframework.security.authentication.event.AbstractAuthenticationEvent;
2525
import org.springframework.security.authentication.event.AbstractAuthenticationFailureEvent;
2626
import org.springframework.security.authentication.event.AuthenticationSuccessEvent;
27+
import org.springframework.security.authentication.event.LogoutSuccessEvent;
2728
import org.springframework.security.web.authentication.switchuser.AuthenticationSwitchUserEvent;
2829
import org.springframework.util.ClassUtils;
2930

@@ -51,6 +52,13 @@ public class AuthenticationAuditListener extends AbstractAuthenticationAuditList
5152
*/
5253
public static final String AUTHENTICATION_SWITCH = "AUTHENTICATION_SWITCH";
5354

55+
/**
56+
* Logout success event type.
57+
*
58+
* @since 3.4.0
59+
*/
60+
public static final String LOGOUT_SUCCESS = "LOGOUT_SUCCESS";
61+
5462
private static final String WEB_LISTENER_CHECK_CLASS = "org.springframework.security.web.authentication.switchuser.AuthenticationSwitchUserEvent";
5563

5664
private final WebAuditListener webListener = maybeCreateWebListener();
@@ -73,6 +81,9 @@ else if (this.webListener != null && this.webListener.accepts(event)) {
7381
else if (event instanceof AuthenticationSuccessEvent successEvent) {
7482
onAuthenticationSuccessEvent(successEvent);
7583
}
84+
else if (event instanceof LogoutSuccessEvent logoutSuccessEvent) {
85+
onLogoutSuccessEvent(logoutSuccessEvent);
86+
}
7687
}
7788

7889
private void onAuthenticationFailureEvent(AbstractAuthenticationFailureEvent event) {
@@ -93,6 +104,14 @@ private void onAuthenticationSuccessEvent(AuthenticationSuccessEvent event) {
93104
publish(new AuditEvent(event.getAuthentication().getName(), AUTHENTICATION_SUCCESS, data));
94105
}
95106

107+
private void onLogoutSuccessEvent(LogoutSuccessEvent event) {
108+
Map<String, Object> data = new LinkedHashMap<>();
109+
if (event.getAuthentication().getDetails() != null) {
110+
data.put("details", event.getAuthentication().getDetails());
111+
}
112+
publish(new AuditEvent(event.getAuthentication().getName(), LOGOUT_SUCCESS, data));
113+
}
114+
96115
private static final class WebAuditListener {
97116

98117
void process(AuthenticationAuditListener listener, AbstractAuthenticationEvent input) {

spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/security/AuthenticationAuditListenerTests.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.springframework.security.authentication.event.AuthenticationFailureExpiredEvent;
3030
import org.springframework.security.authentication.event.AuthenticationSuccessEvent;
3131
import org.springframework.security.authentication.event.InteractiveAuthenticationSuccessEvent;
32+
import org.springframework.security.authentication.event.LogoutSuccessEvent;
3233
import org.springframework.security.core.authority.AuthorityUtils;
3334
import org.springframework.security.core.userdetails.User;
3435
import org.springframework.security.web.authentication.switchuser.AuthenticationSwitchUserEvent;
@@ -60,6 +61,13 @@ void testAuthenticationSuccess() {
6061
assertThat(event.getAuditEvent().getType()).isEqualTo(AuthenticationAuditListener.AUTHENTICATION_SUCCESS);
6162
}
6263

64+
@Test
65+
void testLogoutSuccess() {
66+
AuditApplicationEvent event = handleAuthenticationEvent(
67+
new LogoutSuccessEvent(new UsernamePasswordAuthenticationToken("user", "password")));
68+
assertThat(event.getAuditEvent().getType()).isEqualTo(AuthenticationAuditListener.LOGOUT_SUCCESS);
69+
}
70+
6371
@Test
6472
void testOtherAuthenticationSuccess() {
6573
this.listener.onApplicationEvent(new InteractiveAuthenticationSuccessEvent(

0 commit comments

Comments
 (0)