session correction sidebar items 2

This commit is contained in:
alma 2025-04-18 14:26:37 +02:00
parent 7e15100b57
commit 211112d235
2 changed files with 18 additions and 19 deletions

View File

@ -88,6 +88,11 @@ export const authOptions: NextAuthOptions = {
clientSecret: getRequiredEnvVar("KEYCLOAK_CLIENT_SECRET"), clientSecret: getRequiredEnvVar("KEYCLOAK_CLIENT_SECRET"),
issuer: getRequiredEnvVar("KEYCLOAK_ISSUER"), issuer: getRequiredEnvVar("KEYCLOAK_ISSUER"),
profile(profile) { profile(profile) {
// Clean up roles by removing ROLE_ prefix and converting to lowercase
const cleanRoles = (profile.roles ?? []).map(role =>
role.replace(/^ROLE_/, '').toLowerCase()
);
return { return {
id: profile.sub, id: profile.sub,
name: profile.name ?? profile.preferred_username, name: profile.name ?? profile.preferred_username,
@ -95,7 +100,7 @@ export const authOptions: NextAuthOptions = {
first_name: profile.given_name ?? '', first_name: profile.given_name ?? '',
last_name: profile.family_name ?? '', last_name: profile.family_name ?? '',
username: profile.preferred_username ?? profile.email?.split('@')[0] ?? '', username: profile.preferred_username ?? profile.email?.split('@')[0] ?? '',
role: profile.groups ?? [], role: cleanRoles,
} }
}, },
}), }),
@ -108,11 +113,16 @@ export const authOptions: NextAuthOptions = {
async jwt({ token, account, profile }) { async jwt({ token, account, profile }) {
if (account && profile) { if (account && profile) {
const keycloakProfile = profile as KeycloakProfile; const keycloakProfile = profile as KeycloakProfile;
// Clean up roles by removing ROLE_ prefix and converting to lowercase
const cleanRoles = (keycloakProfile.roles ?? []).map(role =>
role.replace(/^ROLE_/, '').toLowerCase()
);
token.accessToken = account.access_token ?? ''; token.accessToken = account.access_token ?? '';
token.refreshToken = account.refresh_token ?? ''; token.refreshToken = account.refresh_token ?? '';
token.accessTokenExpires = account.expires_at ?? 0; token.accessTokenExpires = account.expires_at ?? 0;
token.sub = keycloakProfile.sub; token.sub = keycloakProfile.sub;
token.role = keycloakProfile.roles ?? []; token.role = cleanRoles;
token.username = keycloakProfile.preferred_username ?? ''; token.username = keycloakProfile.preferred_username ?? '';
token.first_name = keycloakProfile.given_name ?? ''; token.first_name = keycloakProfile.given_name ?? '';
token.last_name = keycloakProfile.family_name ?? ''; token.last_name = keycloakProfile.family_name ?? '';

View File

@ -76,18 +76,7 @@ export function Sidebar({ isOpen, onClose }: SidebarProps) {
} }
const userRoles = Array.isArray(session.user.role) ? session.user.role : [session.user.role]; const userRoles = Array.isArray(session.user.role) ? session.user.role : [session.user.role];
console.log('Raw user roles:', userRoles); console.log('User roles:', userRoles);
// Clean up user roles by removing prefixes and converting to lowercase for comparison
const cleanUserRoles = userRoles.map(role => {
const cleaned = role
.replace(/^[\/]/, '') // Remove leading slash
.replace(/^ROLE_/, '') // Remove ROLE_ prefix
.toLowerCase();
console.log('Cleaning role:', { original: role, cleaned });
return cleaned;
});
console.log('Clean user roles:', cleanUserRoles);
// If requiredRole is an array, check if user has any of the roles // If requiredRole is an array, check if user has any of the roles
if (Array.isArray(requiredRole)) { if (Array.isArray(requiredRole)) {
@ -95,10 +84,10 @@ export function Sidebar({ isOpen, onClose }: SidebarProps) {
console.log('Checking multiple roles:', { console.log('Checking multiple roles:', {
requiredRoles: requiredRole, requiredRoles: requiredRole,
cleanRequiredRoles, cleanRequiredRoles,
hasAnyRole: cleanRequiredRoles.some(role => cleanUserRoles.includes(role)), hasAnyRole: cleanRequiredRoles.some(role => userRoles.includes(role)),
matchingRoles: cleanRequiredRoles.filter(role => cleanUserRoles.includes(role)) matchingRoles: cleanRequiredRoles.filter(role => userRoles.includes(role))
}); });
return cleanRequiredRoles.some(role => cleanUserRoles.includes(role)); return cleanRequiredRoles.some(role => userRoles.includes(role));
} }
// For single role requirement // For single role requirement
@ -106,9 +95,9 @@ export function Sidebar({ isOpen, onClose }: SidebarProps) {
console.log('Checking single role:', { console.log('Checking single role:', {
requiredRole, requiredRole,
cleanRequiredRole, cleanRequiredRole,
hasRole: cleanUserRoles.includes(cleanRequiredRole) hasRole: userRoles.includes(cleanRequiredRole)
}); });
return cleanUserRoles.includes(cleanRequiredRole); return userRoles.includes(cleanRequiredRole);
}; };
// Base menu items (available for everyone) // Base menu items (available for everyone)