Skip to content

权限工具 ​

@axewo/fin-core/permission 提供无框架权限判断,只读取已确认的认证状态和权限列表,不解析 Token、不请求身份、不管理路由。

ts
import { hasPermission, hasAny, hasAll } from '@axewo/fin-core/permission'
import type { PermissionSession } from '@axewo/fin-core/permission'

const session: PermissionSession = {
  authenticated: true,
  permissions: ['order:read', 'order:write'],
}
hasPermission(session, 'order:read') // true
hasAny(session, ['order:delete', 'order:read']) // true
hasAll(session, ['order:read', 'order:write']) // true
hasAll(session, []) // false

判断规则 ​

  • 会话缺失、未明确认证、权限列表格式错误时拒绝。
  • 权限名必须非空,采用区分大小写的完整匹配,不自动去除匹配文本中的空格。
  • 权限标识由后端定义、全局唯一即可,例如 button_001,不要求使用「应用:资源:操作」格式;各子应用直接传入对应标识。
  • 已认证会话的 permissions 包含精确标识 *:*:* 时,视为管理员,放行任意有效权限名。*、order:*、*:*:* 均不代表管理员,也不进行通用通配符匹配或角色推断。
  • hasAny 至少匹配一个;hasAll 要求全部匹配,空数组拒绝。
  • 不修改输入或缓存结果,退出、切换身份或权限更新后,每次调用使用最新值。

空条件的含义由上层业务显式定义。例如 fin-micro 路由守卫将无权限声明或空声明视为公开路由,这是路由规则,不改变底层 hasAll(session, []) 的拒绝默认值。

fin-micro 集成 ​

原来的 @axewo/fin-micro/sdk 同名函数继续使用,内部调用 core,无需更改已有子应用代码。SessionInput、SessionSnapshot 包含底层需要的字段,可以直接传给 core 函数。

Vue 的 v-hasPermi、usePermission、connectPermissionRouter 和 MicroRouteView 由 fin-micro 提供,复用以上规则,负责响应式更新、按钮显隐、路由准入和会话撤销。指令需要在当前 Vue App 挂载前注册;新生成的 host/vue 模板已接好。注册、页面、表格操作列和 v-if 完整示例见按钮权限指令。

ts
const admin: PermissionSession = { authenticated: true, permissions: ['*:*:*'] }
hasPermission(admin, 'button_001') // true,不要求固定命名格式
hasAll(admin, ['button_001', 'button_002']) // true
hasPermission(admin, '') // false,管理员也必须传入有效权限名
hasAny(admin, []) // false
hasPermission({ ...admin, authenticated: false }, 'button_001') // false

普通应用可只安装 fin-core 并使用自己的登录状态,不需要引入 fin-micro。前端权限用于展示与交互控制,服务端接口必须独立鉴权。