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

Aqueduct认证接口返回userId及数据存储关联用户ID问题

关于Aqueduct认证接口返回userId及数据关联用户ID的解决方案

一、让登录接口返回userId:需要自定义控制器

官方的AuthController默认只返回token、token类型和过期时间,要带上userId的话,确实得自定义一个控制器来扩展它的功能。具体操作如下:

  1. 创建自定义认证控制器,继承自AuthController
  2. 重写createToken方法,在完成用户认证后,从认证结果中取出用户ID并追加到响应体里

示例代码:

class CustomAuthController extends AuthController {
  CustomAuthController(AuthServer authServer) : super(authServer);

  @override
  Future<Response> createToken() async {
    // 先调用父类方法完成认证逻辑,拿到默认响应数据
    final response = await super.createToken();
    
    // 从请求上下文获取已认证的用户信息(这里假设你的用户模型是User)
    final auth = request.authorization;
    if (auth != null && auth.resourceOwner != null) {
      // 将userId添加到响应的JSON结构中
      final responseBody = response.body as Map<String, dynamic>;
      responseBody['userId'] = (auth.resourceOwner as User).id;
      return Response.ok(responseBody);
    }
    
    return response;
  }
}

之后把路由替换为自定义控制器:

.route('/auth/token').link(() => CustomAuthController(authServer))

这样登录接口返回的结果就会包含userId字段了。

二、在addData接口关联存储用户ID

要实现数据与用户的绑定,需要分两步处理:

1. 给Data模型添加用户关联字段

首先在Data模型类中,添加用户ID字段(或直接关联User模型,按需选择):

class Data extends ManagedObject<_Data> implements _Data {}

class _Data {
  @primaryKey
  int id;
  
  // 添加用户ID字段,用于关联用户
  int userId;
  
  // 其他业务字段示例
  String content;
}

如果想用模型关联的方式,可以改成:

@Relate(#dataList, isRequired: true, onDelete: DeleteRule.cascade)
User user;

2. 在接口中获取当前用户ID并赋值

在addData接口中,通过request.authorization获取当前登录用户的认证信息,然后将用户ID赋值给新创建的Data对象。记得给接口加上@RequireAuthorization()注解,确保只有登录用户能访问:

@Operation.post()
@RequireAuthorization() // 强制验证用户登录状态
Future<Response> addData(@Bind.body(ignore: ['id', 'userId']) Data newData) async {
  // 获取当前登录用户的认证信息
  final auth = request.authorization;
  if (auth == null) {
    return Response.unauthorized();
  }
  
  final query = Query<Data>(context)..values = newData;
  // 给Data对象设置关联的userId
  query.values.userId = auth.resourceOwnerID;
  
  // 如果是模型关联的写法:
  // query.values.user = await User.find(context, auth.resourceOwnerID);
  
  final insertData = await query.insert();
  return Response.ok(insertData);
}

这样新创建的Data数据就会和当前登录用户绑定,存储对应的userId了。

内容的提问来源于stack exchange,提问作者delmin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 13:42:47