feat(auth): add view as user and role functionality for owners
Allow owners to impersonate users or roles for debugging permissions. Add view-as targets to user sessions and resolve effective permissions. Display a persistent banner in the app shell to exit view-as mode.
This commit is contained in:
@@ -27,6 +27,7 @@ import { api, notifyAuthChange, onAuthChange, type AuthUser, type Language } fro
|
||||
const { t, locale } = useI18n();
|
||||
const router = useRouter();
|
||||
const currentUser = ref<AuthUser | null>(null);
|
||||
const viewAsBusy = ref(false);
|
||||
const languages = ref<Language[]>([
|
||||
{ code: 'en', name: 'English', enabled: true, isDefault: true, sortOrder: 10 },
|
||||
{ code: 'zh-CN', name: '简体中文', enabled: true, isDefault: false, sortOrder: 20 }
|
||||
@@ -134,6 +135,21 @@ async function logout() {
|
||||
await router.push('/');
|
||||
}
|
||||
|
||||
async function stopViewAs() {
|
||||
if (viewAsBusy.value) {
|
||||
return;
|
||||
}
|
||||
|
||||
viewAsBusy.value = true;
|
||||
try {
|
||||
const response = await api.stopViewAs();
|
||||
currentUser.value = response.user;
|
||||
notifyAuthChange();
|
||||
} finally {
|
||||
viewAsBusy.value = false;
|
||||
}
|
||||
}
|
||||
|
||||
async function loadLanguages() {
|
||||
try {
|
||||
const loadedLanguages = await api.languages();
|
||||
@@ -179,7 +195,9 @@ onUnmounted(() => {
|
||||
:languages="languages"
|
||||
:locale="locale"
|
||||
:nav-items="navItems"
|
||||
:view-as-busy="viewAsBusy"
|
||||
@logout="logout"
|
||||
@stop-view-as="stopViewAs"
|
||||
@update:locale="updateLocale"
|
||||
>
|
||||
<NuxtPage :key="locale" />
|
||||
|
||||
Reference in New Issue
Block a user