olli 6b5e82cd2e feat(auth): Add hasPermission method for role-based access control
feat(module-registry): Enhance module booting logic for development environment

feat(menu-item-registry): Allow loading of unlicensed plugins in development mode
2025-12-05 15:02:42 +01:00

69 lines
1.8 KiB
JavaScript

import { defineStore } from 'pinia';
import { ref, computed } from 'vue';
export const useAuthStore = defineStore('auth', () => {
const user = ref(null);
const isAuthenticated = computed(() => user.value !== null);
const fullName = computed(() => {
if (!user.value) return '';
return user.value.fullName || `${user.value.firstName} ${user.value.lastName}`;
});
const hasRole = (role) => {
if (!user.value) return false;
return user.value.roles && user.value.roles.includes(role);
};
const hasPermission = (permission) => {
if (!user.value) return false;
// Admin hat immer alle Permissions
if (hasRole('ROLE_ADMIN')) return true;
// Permission format: "module.action" z.B. "billing.view"
const [module, action] = permission.split('.');
if (!module || !action) return false;
// Prüfe ob User die Module-Permission hat
// Dies wird serverseitig validiert, hier nur UI-Steuerung
if (!user.value.modulePermissions) return false;
const modulePerms = user.value.modulePermissions[module];
if (!modulePerms) return false;
return modulePerms.includes(action);
};
const isAdmin = computed(() => hasRole('ROLE_ADMIN'));
const initializeFromElement = () => {
const appElement = document.getElementById('app');
if (appElement && appElement.dataset.user) {
try {
const userData = JSON.parse(appElement.dataset.user);
if (userData) {
user.value = userData;
}
} catch (error) {
console.error('Error parsing user data:', error);
}
}
};
const logout = async () => {
window.location.href = '/logout';
};
return {
user,
isAuthenticated,
fullName,
hasRole,
hasPermission,
isAdmin,
initializeFromElement,
logout
};
});