From 40135550f86ea63fbebcf30e58ce0bf2c971e29c Mon Sep 17 00:00:00 2001 From: Andreas Dahm Date: Tue, 28 Apr 2026 15:43:27 +0200 Subject: [PATCH] Extended pricipal to add steam id --- mvnw | 0 .../security/JwtAuthenticationFilter.java | 3 ++- .../configuration/security/JwtService.java | 21 ++++++++++++++--- .../modules/login/model/User.java | 1 + .../entities/MinimalUserEntity.java | 3 +++ .../persistence/mapper/EntityMapper.java | 1 + .../modules/login/service/LoginService.java | 2 +- .../modules/login/service/TokenGenerator.java | 7 +++--- .../shared/security/UserPrincipal.java | 3 ++- .../security/JwtServiceTest.java | 23 +++++++++++++++---- .../login/service/LoginServiceTest.java | 2 +- .../modules/user/api/UserControllerTest.java | 6 ++--- 12 files changed, 55 insertions(+), 17 deletions(-) mode change 100644 => 100755 mvnw diff --git a/mvnw b/mvnw old mode 100644 new mode 100755 diff --git a/src/main/java/auth_service/configuration/security/JwtAuthenticationFilter.java b/src/main/java/auth_service/configuration/security/JwtAuthenticationFilter.java index 798ce60..20f1e2d 100644 --- a/src/main/java/auth_service/configuration/security/JwtAuthenticationFilter.java +++ b/src/main/java/auth_service/configuration/security/JwtAuthenticationFilter.java @@ -47,10 +47,11 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter { try { final String userEmail = jwtService.extractEmail(jwt); final String userId = jwtService.extractUserId(jwt); + final Long steamId = jwtService.extractSteamId(jwt); if (userEmail != null && userId != null && SecurityContextHolder.getContext().getAuthentication() == null) { - UserPrincipal principal = new UserPrincipal(userId, userEmail); + UserPrincipal principal = new UserPrincipal(userId, userEmail, steamId); UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken( principal, null, diff --git a/src/main/java/auth_service/configuration/security/JwtService.java b/src/main/java/auth_service/configuration/security/JwtService.java index ac2c9f9..246213e 100644 --- a/src/main/java/auth_service/configuration/security/JwtService.java +++ b/src/main/java/auth_service/configuration/security/JwtService.java @@ -29,12 +29,18 @@ public class JwtService implements TokenGenerator { * @return A signed JWT string */ @Override - public String generateToken(String userId, String email) { - return Jwts.builder() + public String generateToken(String userId, String email, Long steamId) { + var builder = Jwts.builder() .subject(email) .claim("userId", userId) .issuedAt(new Date(System.currentTimeMillis())) - .expiration(new Date(System.currentTimeMillis() + JWT_EXPIRATION_MS)) + .expiration(new Date(System.currentTimeMillis() + JWT_EXPIRATION_MS)); + + if (steamId != null) { + builder.claim("steamId", steamId); + } + + return builder .signWith(getSigningKey()) .compact(); } @@ -57,6 +63,15 @@ public class JwtService implements TokenGenerator { .get("userId", String.class); } + public Long extractSteamId(String token) { + return Jwts.parser() + .verifyWith(getSigningKey()) + .build() + .parseSignedClaims(token) + .getPayload() + .get("steamId", Long.class); + } + public boolean isTokenValid(String token) { try { Jwts.parser() diff --git a/src/main/java/auth_service/modules/login/model/User.java b/src/main/java/auth_service/modules/login/model/User.java index ef9e9c0..1a358e8 100644 --- a/src/main/java/auth_service/modules/login/model/User.java +++ b/src/main/java/auth_service/modules/login/model/User.java @@ -9,4 +9,5 @@ public class User { private long id; private String email; private String password; + private Long steamId; } diff --git a/src/main/java/auth_service/modules/login/persistence/entities/MinimalUserEntity.java b/src/main/java/auth_service/modules/login/persistence/entities/MinimalUserEntity.java index fd0cde2..75dd2e4 100644 --- a/src/main/java/auth_service/modules/login/persistence/entities/MinimalUserEntity.java +++ b/src/main/java/auth_service/modules/login/persistence/entities/MinimalUserEntity.java @@ -32,4 +32,7 @@ public class MinimalUserEntity { @Column(name = "last_login_date") private LocalDateTime lastLoginDate; + + @Column(name = "steam_id") + private Long steamId; } diff --git a/src/main/java/auth_service/modules/login/persistence/mapper/EntityMapper.java b/src/main/java/auth_service/modules/login/persistence/mapper/EntityMapper.java index b351f3a..ca5b001 100644 --- a/src/main/java/auth_service/modules/login/persistence/mapper/EntityMapper.java +++ b/src/main/java/auth_service/modules/login/persistence/mapper/EntityMapper.java @@ -15,6 +15,7 @@ public abstract class EntityMapper { model.setId(entity.getId()); model.setEmail(entity.getEmail()); model.setPassword(entity.getPassword()); + model.setSteamId(entity.getSteamId()); } return model; diff --git a/src/main/java/auth_service/modules/login/service/LoginService.java b/src/main/java/auth_service/modules/login/service/LoginService.java index 4fa76ee..2da2d58 100644 --- a/src/main/java/auth_service/modules/login/service/LoginService.java +++ b/src/main/java/auth_service/modules/login/service/LoginService.java @@ -30,6 +30,6 @@ public class LoginService { throw new InvalidCredentialsException("Invalid credentials"); } minimalUserRepository.updateLoginDate(foundUser.getId()); - return tokenGenerator.generateToken(String.valueOf(foundUser.getId()), foundUser.getEmail()); + return tokenGenerator.generateToken(String.valueOf(foundUser.getId()), foundUser.getEmail(), foundUser.getSteamId()); } } diff --git a/src/main/java/auth_service/modules/login/service/TokenGenerator.java b/src/main/java/auth_service/modules/login/service/TokenGenerator.java index 60493c4..f19ccd7 100644 --- a/src/main/java/auth_service/modules/login/service/TokenGenerator.java +++ b/src/main/java/auth_service/modules/login/service/TokenGenerator.java @@ -8,10 +8,11 @@ public interface TokenGenerator { /** * Generates a token for the given user. * - * @param userId The unique identifier of the user. - * @param email The email address of the user. + * @param userId The unique identifier of the user. + * @param email The email address of the user. + * @param steamId The Steam ID of the user. * @return The generated token string. */ - String generateToken(String userId, String email); + String generateToken(String userId, String email, Long steamId); } diff --git a/src/main/java/auth_service/shared/security/UserPrincipal.java b/src/main/java/auth_service/shared/security/UserPrincipal.java index e70f820..b195b31 100644 --- a/src/main/java/auth_service/shared/security/UserPrincipal.java +++ b/src/main/java/auth_service/shared/security/UserPrincipal.java @@ -4,7 +4,8 @@ import java.security.Principal; public record UserPrincipal( String id, - String email + String email, + Long steamId ) implements Principal { @Override diff --git a/src/test/java/auth_service/configuration/security/JwtServiceTest.java b/src/test/java/auth_service/configuration/security/JwtServiceTest.java index bae0036..b7c44c9 100644 --- a/src/test/java/auth_service/configuration/security/JwtServiceTest.java +++ b/src/test/java/auth_service/configuration/security/JwtServiceTest.java @@ -31,7 +31,7 @@ class JwtServiceTest extends AbstractUnitTest { var email = "test@example.com"; // Act - var token = jwtService.generateToken(userId, email); + var token = jwtService.generateToken(userId, email, null); // Assert assertNotNull(token); @@ -43,7 +43,7 @@ class JwtServiceTest extends AbstractUnitTest { // Arrange var userId = "0815"; var email = "test@example.com"; - var token = jwtService.generateToken(userId, email); + var token = jwtService.generateToken(userId, email, null); // Act var extractedEmail = jwtService.extractEmail(token); @@ -57,7 +57,7 @@ class JwtServiceTest extends AbstractUnitTest { // Arrange var userId = "0815"; var email = "test@example.com"; - var token = jwtService.generateToken(userId, email); + var token = jwtService.generateToken(userId, email, null); // Act var extractedUserId = jwtService.extractUserId(token); @@ -66,12 +66,27 @@ class JwtServiceTest extends AbstractUnitTest { assertEquals(userId, extractedUserId); } + @Test + void extractSteamId_Success() { + // Arrange + var userId = "0815"; + var email = "test@example.com"; + var steamId = 123456789L; + var token = jwtService.generateToken(userId, email, steamId); + + // Act + var extractedSteamId = jwtService.extractSteamId(token); + + // Assert + assertEquals(steamId, extractedSteamId); + } + @Test void isTokenValid_Success() { // Arrange var userId = "0815"; var email = "test@example.com"; - var token = jwtService.generateToken(userId, email); + var token = jwtService.generateToken(userId, email, null); // Act var isValid = jwtService.isTokenValid(token); diff --git a/src/test/java/auth_service/modules/login/service/LoginServiceTest.java b/src/test/java/auth_service/modules/login/service/LoginServiceTest.java index 4a35575..4b814a5 100644 --- a/src/test/java/auth_service/modules/login/service/LoginServiceTest.java +++ b/src/test/java/auth_service/modules/login/service/LoginServiceTest.java @@ -54,7 +54,7 @@ class LoginServiceTest extends AbstractUnitTest { .build(); when(minimalUserRepository.findByEmail(user.getEmail())).thenReturn(Optional.of(dbUser)); when(passwordEncoder.matches(user.getPassword(), dbUser.getPassword())).thenReturn(true); - when(tokenGenerator.generateToken("815", "test@example.com")).thenReturn("mock-token"); + when(tokenGenerator.generateToken("815", "test@example.com", null)).thenReturn("mock-token"); // Act var result = loginService.login(user); diff --git a/src/test/java/auth_service/modules/user/api/UserControllerTest.java b/src/test/java/auth_service/modules/user/api/UserControllerTest.java index c068bc4..c7204ed 100644 --- a/src/test/java/auth_service/modules/user/api/UserControllerTest.java +++ b/src/test/java/auth_service/modules/user/api/UserControllerTest.java @@ -63,7 +63,7 @@ class UserControllerTest extends AbstractWebMvcTest { var email = "test@example.com"; var settings = UserSettings.builder().language("en").theme("dark").build(); var user = User.builder().email(email).settings(settings).build(); - var principal = new UserPrincipal("1", email); + var principal = new UserPrincipal("1", email, null); SecurityContextHolder.getContext().setAuthentication( new UsernamePasswordAuthenticationToken(principal, null, Collections.emptyList()) ); @@ -80,7 +80,7 @@ class UserControllerTest extends AbstractWebMvcTest { void getCurrentUserV1_NotFound() throws Exception { // Arrange var email = "notfound@example.com"; - var principal = new UserPrincipal("1", email); + var principal = new UserPrincipal("1", email, null); SecurityContextHolder.getContext().setAuthentication( new UsernamePasswordAuthenticationToken(principal, null, Collections.emptyList()) ); @@ -96,7 +96,7 @@ class UserControllerTest extends AbstractWebMvcTest { void updateUserSettings_Success() throws Exception { // Arrange var email = "test@example.com"; - var principal = new UserPrincipal("1", email); + var principal = new UserPrincipal("1", email, null); SecurityContextHolder.getContext().setAuthentication( new UsernamePasswordAuthenticationToken(principal, null, Collections.emptyList()) );