Skip to content

Commit 37e3dce

Browse files
Merge pull request #6 from smartSenseSolutions/feat/handle-event-when-authorization-header-is-missing
feat(HandleEvents): Handle events for authorization/authentication failure.
2 parents 346f950 + 9ec95bc commit 37e3dce

File tree

2 files changed

+69
-0
lines changed

2 files changed

+69
-0
lines changed

ss-web/src/main/java/ss/mod/demo/web/config/security/AuthenticationConfig.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,12 @@
66
import lombok.AllArgsConstructor;
77
import lombok.extern.slf4j.Slf4j;
88
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
9+
import org.springframework.context.ApplicationEventPublisher;
910
import org.springframework.context.annotation.Bean;
1011
import org.springframework.context.annotation.Configuration;
1112
import org.springframework.http.HttpMethod;
13+
import org.springframework.security.authentication.AuthenticationEventPublisher;
14+
import org.springframework.security.authentication.DefaultAuthenticationEventPublisher;
1215
import org.springframework.security.config.Customizer;
1316
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
1417
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
@@ -97,5 +100,18 @@ public CorsConfigurationSource corsConfigurationSource() {
97100
return source;
98101
}
99102

103+
/**
104+
* This bean is used to publish authentication events, such as successful or failed login attempts.
105+
*
106+
* @param applicationEventPublisher - This instance is used to publish events to the application context.
107+
* @return An instance of DefaultAuthenticationEventPublisher, which implements the AuthenticationEventPublisher interface.
108+
* @see AuthenticationEventPublisher
109+
* @see DefaultAuthenticationEventPublisher
110+
* @see ApplicationEventPublisher
111+
*/
112+
@Bean
113+
public AuthenticationEventPublisher authenticationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
114+
return new DefaultAuthenticationEventPublisher(applicationEventPublisher);
115+
}
100116
}
101117

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/*
2+
* Copyright (c) 2024-25 Smart Sense Consulting Solutions Pvt. Ltd.
3+
*/
4+
package ss.mod.demo.web.config.security;
5+
6+
import lombok.extern.slf4j.Slf4j;
7+
import org.springframework.context.event.EventListener;
8+
import org.springframework.security.authentication.event.AbstractAuthenticationFailureEvent;
9+
import org.springframework.security.authorization.AuthorityAuthorizationDecision;
10+
import org.springframework.security.authorization.AuthorizationDecision;
11+
import org.springframework.security.authorization.event.AuthorizationDeniedEvent;
12+
import org.springframework.security.core.GrantedAuthority;
13+
import org.springframework.stereotype.Component;
14+
15+
import java.util.List;
16+
17+
/**
18+
* This class is responsible for handling security events such as failed authentication and authorization.
19+
* It uses Spring's EventListener annotation to listen for specific events and logs relevant information.
20+
*/
21+
@Component
22+
@Slf4j
23+
public class SecurityEvents {
24+
25+
/**
26+
* Event listener method to handle failed authentication events.
27+
* This method logs a message when a failed authentication occurs due to an invalid 'Bearer' token.
28+
*
29+
* @param failures It's containing details about the failed authentication.
30+
*/
31+
@EventListener
32+
public void onFailure(AbstractAuthenticationFailureEvent failures) {
33+
String excMessage = failures.getException().getMessage();
34+
log.warn("Failed Authentication --> Invalid 'Bearer' token. {}", excMessage);
35+
}
36+
37+
/**
38+
* Event listener method to handle failed authorization events.
39+
* This method logs a message when a failed authorization occurs due to a missing 'Authorization' header.
40+
*
41+
* @param failure It's containing details about the failed authorization.
42+
*/
43+
@EventListener
44+
public void onFailure(AuthorizationDeniedEvent<Object> failure) {
45+
AuthorizationDecision decision = failure.getAuthorizationDecision();
46+
if (decision instanceof AuthorityAuthorizationDecision authorityAuthorizationDecision) {
47+
List<GrantedAuthority> authorities = authorityAuthorizationDecision.getAuthorities().stream().toList();
48+
log.warn("Failed Authorization --> Missing 'Authorization' header OR Required roles are missing in the token. Required roles are {}", authorities);
49+
} else {
50+
log.warn("Failed Authorization --> Some issue in authorization.");
51+
}
52+
}
53+
}

0 commit comments

Comments
 (0)