如何用restful-keystone实现REST API用户登录?及用户接口问题求助
解决restful-keystone暴露User模型REST API的常见问题
我看你正在用restful-keystone把KeystoneJS的User模型做成REST接口,支持创建和获取用户数据,这段代码能跑起来但肯定遇到了一些坑——我之前做类似功能时也踩过同款问题,给你梳理下常见问题的修复方案:
首先贴下你的代码方便对照:
var beforeRetrieve = function (req, res,next) { console.log(req.user); next(); }; restful.expose({ User: { show : ["_id","name", "email"], methods: ["retrieve", "create"] } }).before({ User: { retrieve: [beforeRetrieve, middleware.requireUser], create: [], } }).start();
常见问题1:req.user打印出来是undefined
这是因为Keystone的用户信息是在它自身的核心中间件里挂载到req上的,如果restful-keystone的中间件加载顺序在Keystone中间件之前,就会导致beforeRetrieve执行时req.user还没初始化。你要确保在Keystone启动后再挂载restful-keystone的中间件。
另外要注意:retrieve接口的req.user是当前登录的用户,不是你要查询的目标用户。如果要获取目标用户,得用URL参数里的ID去查:
var beforeRetrieve = function (req, res, next) { // 打印当前登录用户 console.log("当前登录用户:", req.user); // 获取要查询的用户ID const targetUserId = req.params.id; keystone.list('User').model.findById(targetUserId).exec((err, targetUser) => { if (err) return next(err); console.log("目标用户信息:", targetUser); req.targetUser = targetUser; // 挂载到req上供后续使用 next(); }); };
常见问题2:middleware.requireUser没拦截未登录请求
你把beforeRetrieve放在了权限校验中间件前面,导致未登录请求先执行了打印逻辑,才会被拦截。而且中间件的执行顺序是数组里的从左到右,所以得把权限校验放在最前面:
.before({ User: { retrieve: [middleware.requireUser, beforeRetrieve], // 先校验登录,再执行自定义逻辑 create: [], } })
额外建议:创建用户接口的权限控制
如果你的create接口是开放注册,那当前配置没问题;但如果是仅限管理员创建用户,得加个权限校验中间件:
// 自定义管理员校验中间件 const requireAdmin = (req, res, next) => { if (!req.user || !req.user.isAdmin) { return res.status(403).json({ error: "只有管理员才能创建用户" }); } next(); }; // 更新create的钩子配置 .before({ User: { retrieve: [middleware.requireUser, beforeRetrieve], create: [requireAdmin], } })
内容的提问来源于stack exchange,提问作者lled34
相关产品推荐
相关产品推荐

