Aqueduct认证接口返回userId及数据存储关联用户ID问题
关于Aqueduct认证接口返回userId及数据关联用户ID的解决方案
一、让登录接口返回userId:需要自定义控制器
官方的AuthController默认只返回token、token类型和过期时间,要带上userId的话,确实得自定义一个控制器来扩展它的功能。具体操作如下:
- 创建自定义认证控制器,继承自
AuthController - 重写
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
相关产品推荐
相关产品推荐

