最轻量可靠的方式是用uniid.checktoken返回的permission数组做本地判断,但必须配合服务端数据库权限规则校验;permission由服务端动态生成,前端应使用includes而非indexof比对,且敏感操作需每次执行前重新checktoken。

直接用 uniID.checkToken 拿到的 permission 字段做本地判断,是最轻量、最可靠的方式;但必须配合服务端权限规则(如数据库 permission 字段校验),否则前端校验可被绕过。
uniID.checkToken 返回的 permission 怎么用
调用 uniID.checkToken 后,响应中若含 permission 数组,说明你在云函数或 uni-id 配置里启用了权限扩展(needPermission: true)。这个数组是服务端根据用户角色、自定义权限策略动态生成的,不是硬编码在前端的。
- 它只代表「当前 token 有效时,服务端认定你拥有的权限」,不等于前端能随意渲染按钮或跳转路由
- 不要手动拼接字符串去比对,比如
res.permission.indexOf('USER_EDIT') !== -1—— 应该用includes - 示例逻辑:
const { code, permission } = await uniID.checkToken(token); if (code === 0 && permission?.includes('ARTICLE_PUBLISH')) { // 可显示发布按钮 } - 注意:
uniID.checkToken是异步的,别在onLoad里裸调,建议加 loading 或缓存上一次结果避免重复请求
数据库层面的权限控制不能省
前端拿到 permission 只是“知道有权限”,真正执行写操作(如新增文章)时,必须靠数据库权限规则拦截非法请求。否则用户改掉前端 JS 就能绕过。
- 在数据库集合的权限配置 JSON 中,要用
auth.permission做条件,例如:"read": "doc.status == 0 || auth.permission.includes('ARTICLE_MANAGE')", "write": "auth.permission.includes('ARTICLE_PUBLISH')" - 别写成
auth.role == 'admin'这种静态判断——角色可能变,权限应独立管理 - 如果集合没配权限规则,哪怕前端判断正确,
db.collection('articles').add(...)也会被拒绝,报错类似Unauthorized - 权限字段名要和
uniID.checkToken返回的一致,大小写敏感,且必须是字符串数组(不是对象或数字)
云函数里怎么复用同一套权限逻辑
你在云函数中调用 uniCloud.getCurrentUserInfo(),返回值结构和 uniID.checkToken 基本一致,也带 permission 字段。这是服务端视角的权威权限快照。
- 别在云函数里再调一次
uniID.checkToken—— 多余,且可能因 token 过期失败 - 直接解构使用:
exports.main = async function(event, context) { const { uid, role, permission } = await uniCloud.getCurrentUserInfo(); if (!permission?.includes('USER_DELETE')) { return { code: 403, msg: '无删除权限' }; } // 执行删除逻辑 }; - 注意:该 API 仅在客户端调用云函数(非匿名)时可用;若用
uniCloud.callFunction且未传 token,会返回空对象 - 如果你的云函数需支持免登录场景(如公开查询),权限判断要额外加
uid != null分支
容易被忽略的权限同步时机
用户在后台改了角色或权限,前端不会自动感知 —— uniID.checkToken 返回的是 token 签发时的状态,token 过期前不会刷新。
- 除非你主动重登或调用
uniID.refreshToken,否则权限变更要等下次登录才生效 - 不要依赖「实时监听权限变化」,uniCloud 没提供这类推送机制
- 敏感操作(如支付、删账号)建议每次执行前都重新 checkToken,而不是复用页面加载时缓存的结果
- 如果业务要求强实时性,可在用户权限变更后,服务端主动使旧 token 失效(通过修改
uni-id-users表的tokenVersion字段,并在 checkToken 逻辑中校验)











