kt-template-admin/skills/references/core/access.md
2026-05-16 17:30:35 +08:00

3.0 KiB
Raw Blame History

权限控制详细配置

权限模式

前端访问控制frontend

路由权限在前端固定配置,适合角色较固定的系统。

// preferences.ts
export const overridesPreferences = defineOverridesPreferences({
  app: {
    accessMode: 'frontend',
  },
});

// 路由配置
{
  meta: {
    authority: ['super', 'admin'],  // 指定角色
  },
}

// 登录时设置用户角色
authStore.setUserInfo({
  ...userInfo,
  roles: ['super', 'admin'],  // 必须是数组
});

后端访问控制backend

通过接口动态生成路由表。

// preferences.ts
export const overridesPreferences = defineOverridesPreferences({
  app: {
    accessMode: 'backend',
  },
});

// src/router/access.ts
async function generateAccess(options: GenerateMenuAndRoutesOptions) {
  return await generateAccessible(preferences.app.accessMode, {
    fetchMenuListAsync: async () => {
      return await getAllMenus();  // 后端返回菜单数据
    },
  });
}

后端菜单数据格式:

const menus = [
  {
    name: 'Dashboard',
    path: '/dashboard',
    component: '/dashboard/index',  // 视图路径
    meta: {
      title: '仪表盘',
      icon: 'mdi:view-dashboard',
      noBasicLayout: false,  // 是否不使用基础布局
    },
  },
];

混合访问控制mixed

同时使用前端和后端权限控制。

export const overridesPreferences = defineOverridesPreferences({
  app: {
    accessMode: 'mixed',
  },
});

按钮权限控制

获取权限码

// src/store/auth.ts
const accessCodes = await getAccessCodes();
accessStore.setAccessCodes(accessCodes);
// 返回格式: ['AC_100100', 'AC_100110', 'AC_100120']

组件方式

<script setup>
import { AccessControl } from '@vben/access';
</script>

<template>
  <!-- 权限码方式 -->
  <AccessControl :codes="['AC_100100']" type="code">
    <Button>有权限可见</Button>
  </AccessControl>

  <!-- 角色方式 -->
  <AccessControl :codes="['super', 'admin']">
    <Button>管理员可见</Button>
  </AccessControl>
</template>

API 方式

<script setup>
import { useAccess } from '@vben/access';

const { hasAccessByCodes, hasAccessByRoles } = useAccess();
</script>

<template>
  <!-- 权限码判断 -->
  <Button v-if="hasAccessByCodes(['AC_100100'])">有权限可见</Button>

  <!-- 角色判断 -->
  <Button v-if="hasAccessByRoles(['admin'])">管理员可见</Button>

  <!-- 多权限满足其一 -->
  <Button v-if="hasAccessByCodes(['AC_100100', 'AC_100110'])">
    任一权限可见
  </Button>
</template>

指令方式

<template>
  <!-- 权限码指令 -->
  <Button v-access:code="'AC_100100'">单个权限码</Button>
  <Button v-access:code="['AC_100100', 'AC_100110']">多个权限码</Button>

  <!-- 角色指令 -->
  <Button v-access:role="'super'">单个角色</Button>
  <Button v-access:role="['super', 'admin']">多个角色</Button>
</template>

菜单可见但禁止访问

{
  meta: {
    menuVisibleWithForbidden: true,  // 菜单可见访问跳转403
  },
}