Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,15 @@
user.setUserName(mUser.get(0).getUserName());
logger.info("UserAgentUtil isMobile : " + isMobile);

// Store username → JTI mapping so concurrent-session logout can denylist this token
String accessJti = jwtUtil.getJtiFromToken(jwtToken);
redisTemplate.opsForValue().set(
"jti:" + m_User.getUserName().trim().toLowerCase(),
accessJti + "|" + mUser.get(0).getUserID(),
jwtUtil.getAccessTokenExpiration(),
TimeUnit.MILLISECONDS
);

if (isMobile) {
refreshToken = jwtUtil.generateRefreshToken(m_User.getUserName(), user.getUserID().toString());
logger.debug("Refresh token generated successfully for user: {}", user.getUserName());
Expand All @@ -211,7 +220,7 @@
cookieUtil.addJwtTokenToCookie(jwtToken, httpResponse, request);
}

String redisKey = "user_" + mUser.get(0).getUserID(); // Use user ID to create a unique key

Check failure on line 223 in src/main/java/com/iemr/common/controller/users/IEMRAdminController.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Define a constant instead of duplicating this literal "user_" 3 times.

See more on https://sonarcloud.io/project/issues?id=PSMRI_Common-API&issues=AZ4l1i8_PEFRCu6gb-6P&open=AZ4l1i8_PEFRCu6gb-6P&pullRequest=411

// Store the user in Redis (set a TTL of 30 minutes)
redisTemplate.opsForValue().set(redisKey, user, 30, TimeUnit.MINUTES);
Expand Down Expand Up @@ -366,7 +375,7 @@

@Operation(summary = "Log out user from concurrent session")
@RequestMapping(value = "/logOutUserFromConcurrentSession", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON)
public String logOutUserFromConcurrentSession(

Check failure on line 378 in src/main/java/com/iemr/common/controller/users/IEMRAdminController.java

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Refactor this method to reduce its Cognitive Complexity from 22 to the 15 allowed.

See more on https://sonarcloud.io/project/issues?id=PSMRI_Common-API&issues=AZ4l1i8_PEFRCu6gb-6Q&open=AZ4l1i8_PEFRCu6gb-6Q&pullRequest=411
@Param(value = "\"{\\\"userName\\\":\\\"String\\\"}\"") @RequestBody LoginRequestModel m_User,
HttpServletRequest request) {
OutputResponse response = new OutputResponse();
Expand All @@ -387,6 +396,20 @@
if (previousTokenFromRedis != null) {
deleteSessionObjectByGettingSessionDetails(previousTokenFromRedis);
sessionObject.deleteSessionObject(previousTokenFromRedis);

// Denylist the active JWT so the first system's requests are immediately rejected
String usernameKey = mUsers.get(0).getUserName().trim().toLowerCase();
String jtiData = (String) redisTemplate.opsForValue().get("jti:" + usernameKey);
if (jtiData != null) {
String[] parts = jtiData.split("\\|", 2);
String jti = parts[0];
tokenDenylist.addTokenToDenylist(jti, jwtUtil.getAccessTokenExpiration());
if (parts.length > 1) {
redisTemplate.delete("user_" + parts[1]);
}
redisTemplate.delete("jti:" + usernameKey);
}

response.setResponse("User successfully logged out");
} else{
logger.error("Unable to fetch session from redis");
Expand Down Expand Up @@ -522,6 +545,15 @@
isMobile = UserAgentUtil.isMobileDevice(userAgent);
logger.info("UserAgentUtil isMobile : " + isMobile);

// Store username → JTI mapping so concurrent-session logout can denylist this token
String accessJti = jwtUtil.getJtiFromToken(jwtToken);
redisTemplate.opsForValue().set(
"jti:" + m_User.getUserName().trim().toLowerCase(),
accessJti + "|" + mUser.getUserID(),
jwtUtil.getAccessTokenExpiration(),
TimeUnit.MILLISECONDS
);

if (isMobile) {
refreshToken = jwtUtil.generateRefreshToken(m_User.getUserName(), user.getUserID().toString());
logger.debug("Refresh token generated successfully for user: {}", user.getUserName());
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/com/iemr/common/utils/JwtUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,10 @@ public long getRefreshTokenExpiration() {
return REFRESH_EXPIRATION_TIME;
}

public long getAccessTokenExpiration() {
return ACCESS_EXPIRATION_TIME;
}

/**
* Extract user ID from JWT token in the request (checks header and cookie)
* @param request the HTTP request
Expand Down
Loading