fix:priviledge caching led to no pages showing
This commit is contained in:
parent
6c90a00677
commit
05508cc76c
2 changed files with 63 additions and 14 deletions
|
|
@ -30,12 +30,22 @@ export function useCurrentUser() {
|
||||||
// Check if we already have user data in sessionStorage cache
|
// Check if we already have user data in sessionStorage cache
|
||||||
const cachedUser = getUserDataCache();
|
const cachedUser = getUserDataCache();
|
||||||
if (cachedUser) {
|
if (cachedUser) {
|
||||||
setUser(cachedUser);
|
// Validate cached user data - if privilege is missing, refetch from API
|
||||||
console.log('✅ Using cached user data from sessionStorage (persists during session):', {
|
if (cachedUser.privilege === undefined || cachedUser.privilege === null) {
|
||||||
username: cachedUser.username,
|
console.warn('⚠️ Cached user data missing privilege, refetching from API...', {
|
||||||
privilege: cachedUser.privilege
|
username: cachedUser.username,
|
||||||
});
|
privilege: cachedUser.privilege
|
||||||
return;
|
});
|
||||||
|
// Clear incomplete cache and continue to fetch from API
|
||||||
|
clearUserDataCache();
|
||||||
|
} else {
|
||||||
|
setUser(cachedUser);
|
||||||
|
console.log('✅ Using cached user data from sessionStorage (persists during session):', {
|
||||||
|
username: cachedUser.username,
|
||||||
|
privilege: cachedUser.privilege
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// JWT tokens are now stored in httpOnly cookies, so we fetch user data from API
|
// JWT tokens are now stored in httpOnly cookies, so we fetch user data from API
|
||||||
|
|
@ -64,13 +74,37 @@ export function useCurrentUser() {
|
||||||
}
|
}
|
||||||
|
|
||||||
const data = await fetchCurrentUserApi(request, authAuthority || undefined);
|
const data = await fetchCurrentUserApi(request, authAuthority || undefined);
|
||||||
setUser(data);
|
|
||||||
// Cache user data in sessionStorage (cleared on tab close - more secure than localStorage)
|
// Log full response for debugging
|
||||||
setUserDataCache(data);
|
console.log('📦 User data received from API:', {
|
||||||
console.log('✅ User data fetched from API and cached in sessionStorage (secure):', {
|
username: data?.username,
|
||||||
username: data.username,
|
privilege: data?.privilege,
|
||||||
privilege: data.privilege
|
hasPrivilege: !!data?.privilege,
|
||||||
|
allKeys: data ? Object.keys(data) : [],
|
||||||
|
fullData: data
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Validate user data before caching - ensure privilege is present
|
||||||
|
if (!data || !data.privilege) {
|
||||||
|
console.error('❌ User data from API missing privilege field - this may cause permission issues:', {
|
||||||
|
username: data?.username,
|
||||||
|
privilege: data?.privilege,
|
||||||
|
dataKeys: data ? Object.keys(data) : [],
|
||||||
|
fullResponse: data
|
||||||
|
});
|
||||||
|
// Don't cache incomplete data - it will cause permission issues on next load
|
||||||
|
// But still set user so the app can function (permissions are checked via RBAC API)
|
||||||
|
setUser(data);
|
||||||
|
console.warn('⚠️ User data set but not cached due to missing privilege - will refetch on next load');
|
||||||
|
} else {
|
||||||
|
// Only cache if privilege is present
|
||||||
|
setUserDataCache(data);
|
||||||
|
console.log('✅ User data fetched from API and cached in sessionStorage (secure):', {
|
||||||
|
username: data.username,
|
||||||
|
privilege: data.privilege
|
||||||
|
});
|
||||||
|
setUser(data);
|
||||||
|
}
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
console.error('❌ Failed to fetch user data:', error);
|
console.error('❌ Failed to fetch user data:', error);
|
||||||
|
|
||||||
|
|
@ -239,8 +273,15 @@ export function useCurrentUser() {
|
||||||
// Try to load user from sessionStorage cache first for faster initial load
|
// Try to load user from sessionStorage cache first for faster initial load
|
||||||
const cachedUser = getUserDataCache();
|
const cachedUser = getUserDataCache();
|
||||||
if (cachedUser) {
|
if (cachedUser) {
|
||||||
setUser(cachedUser);
|
// Validate cached user data - if privilege is missing, don't use cache
|
||||||
console.log('✅ Using cached user data from sessionStorage on mount (persists during session)');
|
if (cachedUser.privilege === undefined || cachedUser.privilege === null) {
|
||||||
|
console.warn('⚠️ Cached user data missing privilege on mount, will refetch from API');
|
||||||
|
clearUserDataCache();
|
||||||
|
// Don't set user - let fetchCurrentUser handle it
|
||||||
|
} else {
|
||||||
|
setUser(cachedUser);
|
||||||
|
console.log('✅ Using cached user data from sessionStorage on mount (persists during session)');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// For OAuth authentication, wait a bit longer before fetching user data
|
// For OAuth authentication, wait a bit longer before fetching user data
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,14 @@ export interface CachedUserData {
|
||||||
*/
|
*/
|
||||||
export const setUserDataCache = (userData: CachedUserData): void => {
|
export const setUserDataCache = (userData: CachedUserData): void => {
|
||||||
if (userData) {
|
if (userData) {
|
||||||
|
// Validate that privilege is present before caching
|
||||||
|
if (!userData.privilege) {
|
||||||
|
console.warn('⚠️ Attempted to cache user data without privilege, skipping cache:', {
|
||||||
|
username: userData.username,
|
||||||
|
hasPrivilege: !!userData.privilege
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
sessionStorage.setItem(USER_CACHE_KEY, JSON.stringify(userData));
|
sessionStorage.setItem(USER_CACHE_KEY, JSON.stringify(userData));
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue