Appearance
项目权限控制
权限系统模型
- RBAC 模型:基于角色的权限控制
- ABAC 模型:基于属性的权限控制,根据主体(用户)、客体(资源)等多方面属性来决定权限,属性可以是任何与访问相关的信息,像用户的部门、职位、资源的机密级别、访问时间等
RBAC 实现方式
- 前端:路由权限控制 + 按钮权限控制(自定义指令)
- 后端:接口权限控制(中间件)
路由权限
根据不同的用户身份,动态生成页面路径信息。
按钮权限(自定义指令)
ts
// src/directives/permission.ts
import { useUserStore } from '@/stores/user'
import { ROLES_MAP, type Roles } from '@/utils/permission'
import type { App } from 'vue'
const user = useUserStore()
export const permission = (app: App) => {
app.directive('permission', {
mounted(el, binding) {
const roleList = binding.value || []
if (!roleList.length) return el.remove()
const valid = roleList.find(
(item: Roles) => ROLES_MAP[user.role] === item
)
if (!valid) el.remove()
}
})
}
// main.ts
import { permission } from '@/directives/permission'
app.use(permission)使用:
html
<el-table-column
v-permission="['admin']"
prop="password"
label="密码"
width="120"
show-overflow-tooltip
/>权限如何设计的?
面试回答(这块不用想的太复杂,就是需要表述清楚前端和后端对应的权限)
总:划范围/说结论
- 路由,菜单,按钮,模块
我之前在公司参与过这块的设计,我们公司分授权系统和权限系统,授权是登录相关的内容,权限是登录后进行权限配置的内容,这块又分两份,一份资源权限由前端进行负责,一份是数据权限由后端进行负责,资源权限我们又分成路由,菜单,按钮和模块权限;数据权限是控制用户能够访问和操作的具体数据范围
分:聊重点,对分类内容或结论中的其他点进行拓展
- 路由
其中路由权限是最主要也是粒度最粗的基础权限设计,他的核心是利用
beforeEach自动执行进行实现整个加载流程上先进行
beforeEach内容的执行,如果未登录进行授权的处理,授权这块我们也做过相应的优化,如果已登录,我们会进行userinfo的查询,获取对应的权限信息
- 路由