Loopback3自定义用户模型登录API如何返回额外用户字段?
在LoopBack 3中让登录API返回自定义用户字段
嘿,我之前在LoopBack 3里刚好解决过一模一样的需求——完全不用额外调用userModel.find()就能让登录API直接返回你自定义的用户字段,下面给你两种实用的实现方式:
方法一:扩展AccessToken模型(推荐)
LoopBack的登录接口本质是创建并返回AccessToken实例,我们可以通过扩展这个模型,在返回结果时自动追加关联用户的自定义字段:
- 创建自定义AccessToken模型
在common/models/下新建custom-access-token.js,内容如下:
module.exports = function(CustomAccessToken) { // 监听AccessToken创建完成的钩子 CustomAccessToken.afterRemote('create', function(context, accessToken, next) { // 关联你的自定义User模型(假设叫MyUser) accessToken.user(function(err, user) { if (err) return next(err); // 将需要的用户字段追加到响应结果中 context.result.username = user.username; context.result.forcePasswordReset = user.forcePasswordReset; next(); }); }); // 可选:重写toJSON方法,确保序列化时也包含这些字段 CustomAccessToken.prototype.toJSON = function() { const obj = this.toObject(); if (this.user) { obj.username = this.user.username; obj.forcePasswordReset = this.user.forcePasswordReset; } return obj; }; };
- 替换默认AccessToken模型
修改server/model-config.json,把默认的AccessToken替换成我们的自定义模型:
{ "CustomAccessToken": { "dataSource": "db", "public": true }, // ...其他模型配置 "AccessToken": false // 禁用默认模型 }
这样每次登录成功后,返回的Token响应就会自动带上username和forcePasswordReset字段了。
方法二:重写自定义User模型的login方法
如果你更倾向于直接修改用户登录的逻辑,可以重写自定义User模型的login方法,手动合并Token和用户字段:
在你的自定义User模型文件(比如common/models/my-user.js)中添加以下代码:
module.exports = function(MyUser) { // 保存原login方法的引用 const originalLogin = MyUser.login; // 重写login方法 MyUser.login = function(credentials, include, callback) { // 调用原登录逻辑获取Token originalLogin.call(this, credentials, include, function(err, token) { if (err) return callback(err); // 查询用户的自定义字段 MyUser.findById(token.userId, { fields: ['username', 'forcePasswordReset'] }, function(err, user) { if (err) return callback(err); // 将用户字段合并到Token结果中 const response = token.toObject(); response.username = user.username; response.forcePasswordReset = user.forcePasswordReset; callback(null, response); }); }); }; };
注意事项
- 确保你的自定义User模型中,
username和forcePasswordReset字段的ACL权限允许读取(比如设置$authenticated角色可访问); - 如果使用方法一,要保证自定义AccessToken模型和你的User模型关联关系正常(LoopBack默认已经建立了
AccessToken belongsTo User的关联,一般不用额外配置)。
内容的提问来源于stack exchange,提问作者Sashi
相关产品推荐
相关产品推荐

