5
0
mirror of https://github.com/AJMicke/KickerELO.git synced 2026-03-11 21:41:02 +01:00

util: Add AccessControlService::getCurrentUser

In production mode, this returns the currently logged in user. In test
mode, it returns a test user.
This commit is contained in:
Sebastian Beckmann
2025-09-08 22:02:57 +02:00
parent 8827d6732c
commit 3e55606ef8
4 changed files with 57 additions and 1 deletions

View File

@@ -1,5 +1,13 @@
package org.kickerelo.kickerelo.util; package org.kickerelo.kickerelo.util;
import org.kickerelo.kickerelo.data.AuthentikUser;
import javax.annotation.Nonnull;
import java.util.Optional;
public interface AccessControlService { public interface AccessControlService {
boolean userAllowedForRole(String role); boolean userAllowedForRole(String role);
@Nonnull
Optional<AuthentikUser> getCurrentUser();
} }

View File

@@ -1,5 +1,8 @@
package org.kickerelo.kickerelo.util; package org.kickerelo.kickerelo.util;
import org.jetbrains.annotations.NotNull;
import org.kickerelo.kickerelo.data.AuthentikUser;
import org.kickerelo.kickerelo.repository.AuthentikUserRepository;
import org.springframework.context.annotation.Profile; import org.springframework.context.annotation.Profile;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolder;
@@ -7,10 +10,17 @@ import org.springframework.security.oauth2.core.oidc.user.OidcUser;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.List; import java.util.List;
import java.util.Optional;
@Component @Component
@Profile("prod") @Profile("prod")
public class AccessControlServiceProdImpl implements AccessControlService { public class AccessControlServiceProdImpl implements AccessControlService {
private final AuthentikUserRepository userRepository;
public AccessControlServiceProdImpl(AuthentikUserRepository userRepository) {
this.userRepository = userRepository;
}
@Override @Override
public boolean userAllowedForRole(String role) { public boolean userAllowedForRole(String role) {
// Check if authentication is present // Check if authentication is present
@@ -33,4 +43,22 @@ public class AccessControlServiceProdImpl implements AccessControlService {
// Check if the user is part of the required group // Check if the user is part of the required group
return listOfGroups.contains(role); return listOfGroups.contains(role);
} }
@NotNull
@Override
public Optional<AuthentikUser> getCurrentUser() {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth == null || !(auth.getPrincipal() instanceof OidcUser oidcUser)) {
return Optional.empty();
}
String id = oidcUser.getAttribute("sub");
if (id == null) {
throw new RuntimeException("Couldn't find sub attribute on current user.");
}
Optional<AuthentikUser> authentikUser = userRepository.findById(id);
if (authentikUser.isEmpty()) {
throw new RuntimeException("User is authenticated but doesn't exist in database.");
}
return authentikUser;
}
} }

View File

@@ -1,13 +1,32 @@
package org.kickerelo.kickerelo.util; package org.kickerelo.kickerelo.util;
import org.jetbrains.annotations.NotNull;
import org.kickerelo.kickerelo.data.AuthentikUser;
import org.kickerelo.kickerelo.repository.AuthentikUserRepository;
import org.springframework.context.annotation.Profile; import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Optional;
@Component @Component
@Profile("test") @Profile("test")
public class AccessControlServiceTestImpl implements AccessControlService { public class AccessControlServiceTestImpl implements AccessControlService {
private final AuthentikUserRepository userRepository;
public AccessControlServiceTestImpl(AuthentikUserRepository userRepository) {
this.userRepository = userRepository;
userRepository.save(getCurrentUser().orElseThrow()); // Ensure test user exists in DB;
}
@Override @Override
public boolean userAllowedForRole(String role) { public boolean userAllowedForRole(String role) {
return true; return true;
} }
@NotNull
@Override
public Optional<AuthentikUser> getCurrentUser() {
Optional<AuthentikUser> user = userRepository.findById("test_profile_user");
return Optional.of(user.orElseGet(() -> new AuthentikUser("test_profile_user", "Test Profile User")));
}
} }

View File

@@ -24,6 +24,7 @@ public class PlayerListView extends VerticalLayout {
playerGrid.setItems(players); playerGrid.setItems(players);
playerGrid.removeColumnByKey("id"); playerGrid.removeColumnByKey("id");
playerGrid.removeColumnByKey("elo_alt"); playerGrid.removeColumnByKey("elo_alt");
playerGrid.removeColumnByKey("authentikUser");
Grid.Column<Spieler> nameColumn = playerGrid.getColumnByKey("name"); Grid.Column<Spieler> nameColumn = playerGrid.getColumnByKey("name");
Grid.Column<Spieler> elo1vs1Column = playerGrid.getColumnByKey("elo1vs1"); Grid.Column<Spieler> elo1vs1Column = playerGrid.getColumnByKey("elo1vs1");
Grid.Column<Spieler> elo2vs2Column = playerGrid.getColumnByKey("elo2vs2"); Grid.Column<Spieler> elo2vs2Column = playerGrid.getColumnByKey("elo2vs2");