如何阻止Feathers.js中已认证用户通过users路由获取全部用户列表
Feathers.js 用户查询权限限制解决方案
问题根因
Feathers 官方脚手架生成的users服务默认开放了已认证用户的全量查询权限,未做访问范围限制,所以会出现登录后即可拉取所有用户数据的问题。你之前修改全局响应逻辑影响/authentication路由,是因为authentication服务内部会调用users服务查询用户信息,全量修改会拦截内部正常调用。
实现步骤
使用 Feathers 官方推荐的服务钩子机制实现权限控制,完全不会干扰内置路由运行:
- 找到
users服务的钩子配置文件,默认路径为src/services/users/users.hooks.js - 为
find、get方法添加访问限制逻辑,仅对外部HTTP请求生效,内部服务调用不受影响:
const { authenticate } = require('@feathersjs/express'); const { iff, isProvider } = require('feathers-hooks-common'); module.exports = { before: { all: [], find: [ authenticate('jwt'), // 仅外部请求需要限制查询范围 iff(isProvider('external'), async context => { const { user } = context.params; // 如需保留管理员全量查询权限,放开下方注释即可 // if(user.role === 'admin') return context; // 普通用户仅能查询自身信息,覆盖查询条件 context.params.query = { ...context.params.query, // 如使用MongoDB,此处改为 _id: user._id id: user.id }; return context; }) ], get: [ authenticate('jwt'), iff(isProvider('external'), async context => { const { user, id } = context.params; // 如管理员可查询所有用户信息,放开下方注释 // if(user.role === 'admin') return context; if(id !== user.id.toString()) { throw new Error('无权访问该用户信息'); } return context; }) ], // 其余方法的钩子保持原有配置即可 create: [], update: [authenticate('jwt')], patch: [authenticate('jwt')], remove: [authenticate('jwt')] }, after: { all: [ // 可选:全局过滤返回的敏感字段,避免密码哈希等信息泄露 async context => { const filterSensitive = (user) => { delete user.password; delete user.sensitiveInfo; return user; }; if(context.result.data) { context.result.data = context.result.data.map(filterSensitive); } else if(context.result) { context.result = filterSensitive(context.result); } return context; } ] }, error: {} };
注意事项
不要直接修改服务的默认返回逻辑或者添加全局响应拦截,所有权限逻辑收敛到对应服务的钩子中实现,可根据业务需求灵活扩展不同角色的权限规则。
内容的提问来源于stack exchange,提问作者Youzef
相关产品推荐
相关产品推荐

