nuxt-permissions
Version:
Nuxt 3 module for permission management
106 lines (105 loc) • 3.24 kB
JavaScript
import { defineNuxtPlugin, addRouteMiddleware, useRuntimeConfig } from "#app";
import { useRoles, usePermissions } from "./composables.mjs";
export default defineNuxtPlugin((nuxtApp) => {
const config = useRuntimeConfig().public.nuxtPermissions;
const userRoles = useRoles();
const userPermissions = usePermissions();
function hasRequiredPermissions(permissions) {
if (!permissions)
return;
const routePermissions = typeof permissions === "string" ? [permissions] : permissions;
return routePermissions.some((permission) => {
return userPermissions.value.includes(permission);
});
}
function hasRequiredRoles(roles) {
if (!roles)
return;
const fullAccessRoles = typeof config.fullAccessRoles === "string" ? [config.fullAccessRoles] : config.fullAccessRoles;
const myRoles = typeof roles === "string" ? [roles] : roles;
if (fullAccessRoles && fullAccessRoles.some((role) => userRoles.value.includes(role))) {
return true;
}
return myRoles.some((role) => userRoles.value.includes(role));
}
addRouteMiddleware("nuxt-permissions", (to, from) => {
const routePermissions = to.meta?.permissions;
const routeRoles = to.meta?.roles;
if (!routePermissions && !routeRoles) {
return true;
}
if (routePermissions && hasRequiredPermissions(routePermissions)) {
return true;
}
if (routeRoles && hasRequiredRoles(routeRoles)) {
return true;
}
if (!config.redirectIfNotAllowed) {
if (from.fullPath !== to.fullPath) {
return from.fullPath;
}
return false;
}
return config.redirectIfNotAllowed || "/";
});
function hasNotPermission(binding) {
if (!binding)
return true;
const activePermissions = typeof binding === "string" ? [binding] : binding;
return !activePermissions.some(
(permission) => userPermissions.value.includes(permission)
);
}
function hasPermission(binding) {
if (!binding)
return true;
return !hasNotPermission(binding);
}
nuxtApp.vueApp.directive("can", {
mounted(el, binding) {
if (binding.arg === "not") {
if (hasPermission(binding.value)) {
el.remove();
}
return;
}
if (!hasPermission(binding.value)) {
el.remove();
}
}
});
function hasNotRole(binding) {
if (!binding)
return true;
const activeRoles = typeof binding === "string" ? [binding] : binding;
return !activeRoles.some((role) => userRoles.value.includes(role));
}
function hasRole(binding) {
if (!binding)
return true;
const fullAccessRoles = typeof config.fullAccessRoles === "string" ? [config.fullAccessRoles] : config.fullAccessRoles;
if (fullAccessRoles && fullAccessRoles.some((role) => userRoles.value.includes(role))) {
return true;
}
return !hasNotRole(binding);
}
nuxtApp.vueApp.directive("role", {
mounted(el, binding) {
if (binding.arg === "not") {
if (hasRole(binding.value)) {
el.remove();
}
return;
}
if (!hasRole(binding.value)) {
el.remove();
}
}
});
return {
provide: {
hasRole,
hasPermission
}
};
});