@winner-fed/plugin-access
Version:
适配 access(权限)的 WinJS 插件,适用于 Vue3。
271 lines (198 loc) • 6.07 kB
Markdown
# @winner-fed/plugin-access
适配 access(权限)的 WinJS 插件,适用于 Vue3。
<p>
<a href="https://npmjs.com/package/@winner-fed/plugin-access">
<img src="https://img.shields.io/npm/v/@winner-fed/plugin-access?style=flat-square&colorA=564341&colorB=EDED91" alt="npm version" />
</a>
<img src="https://img.shields.io/badge/License-MIT-blue.svg?style=flat-square&colorA=564341&colorB=EDED91" alt="license" />
<a href="https://npmcharts.com/compare/@winner-fed/plugin-access?minimal=true"><img src="https://img.shields.io/npm/dm/@winner-fed/plugin-access.svg?style=flat-square&colorA=564341&colorB=EDED91" alt="downloads" /></a>
</p>
## 功能特性
- 🔐 基于角色的权限管理系统 (RBAC)
- 🚀 支持动态设置角色和权限
- 🛡️ 提供路由级别的权限控制
- 🎯 提供组件级别的权限控制(指令和组件)
- ⚡ 支持同步和异步权限检查
- 🔍 支持路径模式匹配(支持通配符)
- 📦 开箱即用,零配置启动
- 🔧 可配置的权限控制处理器
## 安装
```bash
npm install @winner-fed/plugin-access
```
## 基本配置
在 `.winrc.ts` 中配置插件:
```typescript
import { defineConfig } from 'win';
export default defineConfig({
plugins: [require.resolve('@winner-fed/plugin-access')],
access: {
roles: {
admin: ['/', '/admin', '/users/*'],
normal: ['/normal', '/profile'],
guest: ['/login', '/register']
}
}
});
```
## 使用方法
### 1. 路由配置
```typescript
// src/app.ts
import { access as accessApi } from 'winjs';
// 设置默认角色
accessApi.setRole('admin');
export const access = {
noFoundHandler({ next }) {
// 处理404页面
const accessIds = accessApi.getAccess();
if (!accessIds.includes('/404')) {
accessApi.setAccess(accessIds.concat(['/404']));
}
next('/404');
},
unAccessHandler({ next }) {
// 处理无权限访问
next('/403');
},
ignoreAccess: ['/login', '/register'] // 忽略权限检查的路由
};
```
### 2. 组件中使用
#### 使用 v-access 指令
```vue
<template>
<div>
<!-- 只有有权限的用户才能看到 -->
<div v-access="'/admin'">管理员内容</div>
<!-- 支持动态权限 -->
<div v-access="dynamicPath">动态内容</div>
<!-- 支持通配符 -->
<div v-access="'/users/*'">用户管理</div>
</div>
</template>
<script setup>
import { ref } from 'vue';
const dynamicPath = ref('/profile');
</script>
```
#### 使用 Access 组件
```vue
<template>
<div>
<Access id="/admin">
<template #default>
<div>管理员专用功能</div>
</template>
</Access>
</div>
</template>
```
#### 使用 useAccess Hook
```vue
<template>
<div>
<div v-if="hasAdminAccess">管理员功能</div>
<div v-if="hasUserAccess">用户功能</div>
</div>
</template>
<script setup>
import { useAccess } from 'winjs';
const hasAdminAccess = useAccess('/admin');
const hasUserAccess = useAccess('/users/*');
</script>
```
### 3. 编程式权限控制
```typescript
import { access } from 'winjs';
// 设置角色
access.setRole('admin');
// 设置权限
access.setAccess(['/admin', '/users']);
// 检查权限(异步)
const hasAccess = await access.hasAccess('/admin');
// 检查权限(同步)
const hasAccessSync = access.hasAccessSync('/admin');
// 获取当前角色
const currentRole = access.getRole();
// 获取当前权限列表
const currentAccess = access.getAccess();
// 路径匹配
const isMatch = access.match('/users/profile', ['/users/*']);
// 设置预设权限
access.setPresetAccess(['/public', '/common']);
```
## API 文档
### 配置项
#### access.roles
- 类型:`Record<string, string[]>`
- 描述:角色与权限的映射关系
#### access.noFoundHandler
- 类型:`(params: { router, to, from, next }) => void`
- 描述:404页面处理函数
#### access.unAccessHandler
- 类型:`(params: { router, to, from, next }) => void`
- 描述:无权限访问处理函数
#### access.ignoreAccess
- 类型:`string[]`
- 描述:忽略权限检查的路由列表
### Access 对象方法
#### setRole(roleId: string | Promise<string>)
设置当前用户角色。
#### getRole(): string
获取当前用户角色。
#### setAccess(accessIds: string[] | Promise<string[]>)
设置当前用户权限列表。
#### getAccess(): string[]
获取当前用户权限列表。
#### hasAccess(path: string): Promise<boolean>
异步检查是否有指定路径的权限。
#### hasAccessSync(path: string): boolean
同步检查是否有指定路径的权限。
#### match(path: string, accessIds: string[]): boolean
检查路径是否匹配权限列表。
#### setPresetAccess(accessIds: string | string[])
设置预设权限。
#### isDataReady(): boolean
检查权限数据是否准备就绪。
### useAccess Hook
```typescript
const hasAccess = useAccess(path: string | Ref<string>): Ref<boolean>
```
返回一个响应式的权限状态。
## 高级用法
### 1. 异步权限设置
```typescript
import { access } from 'winjs';
// 异步设置角色
access.setRole(fetch('/api/user/role').then(res => res.json()));
// 异步设置权限
access.setAccess(fetch('/api/user/permissions').then(res => res.json()));
```
### 2. 动态权限更新
```typescript
import { access } from 'winjs';
// 用户登录后更新权限
function onLogin(userInfo) {
access.setRole(userInfo.role);
access.setAccess(userInfo.permissions);
}
// 用户登出后清空权限
function onLogout() {
access.setRole('guest');
access.setAccess([]);
}
```
### 3. 权限通配符
支持以下通配符模式:
- `/users/*` - 匹配 `/users/` 下的所有路径
- `/admin/*/edit` - 匹配 `/admin/任意内容/edit` 格式的路径
### 4. 权限组合
```typescript
// 预设权限 + 角色权限 + 动态权限
access.setPresetAccess(['/public', '/common']);
access.setRole('admin'); // 自动获取 admin 对应的权限
access.setAccess(['/special']); // 额外的动态权限
```
## 许可证
[MIT](./LICENSE).