You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:13:21