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

Rails中通过GraphQL Mutation销毁用户会话无效的问题求助

问题原因及修复方案

你的会话未正确销毁,核心问题在于仅清空内存中的session哈希但未销毁客户端的session cookie,Rails会在下次请求时自动重建会话。以下是具体修复步骤:

1. 替换会话清空方式

session.clear只会清空当前请求内存里的session数据,但客户端浏览器的session cookie仍存在,导致后续请求会重新生成会话。需使用Rails的reset_session方法,它会销毁客户端的session cookie并彻底重置服务器端会话。

修改destroy_user_session方法:

private

def destroy_user_session
  # 从context获取request对象,调用reset_session销毁会话cookie
  context[:request].reset_session
  # 验证会话是否已清空
  raise GraphQL::ExecutionError, 'Failed to clear session.' unless context[:session].empty?
end

2. 移除无效代码

resolve方法中的user.save!完全多余——你没有修改用户模型的任何属性,无需执行保存操作,直接删除即可:

def resolve(user_id:)
  user = User.find_by(id: user_id)
  raise GraphQL::ExecutionError, 'User not found.' unless user.present?
  destroy_user_session
  { message: 'User session cleared'}
end

3. 确认Context中Session的传递

确保GraphQL控制器已将Rails原生的session和request正确传入context,否则resolver无法操作真实会话。检查app/controllers/graphql_controller.rb的execute方法:

def execute
  variables = prepare_variables(params[:variables])
  query = params[:query]
  operation_name = params[:operationName]
  context = {
    session: session,
    request: request, # 必须传入request才能调用reset_session
    # 其他context参数(如current_user)
  }
  result = MySchema.execute(query, variables: variables, context: context, operation_name: operation_name)
  render json: result
end

4. 验证修复效果

测试时打开浏览器开发者工具(Application > Cookies),调用Mutation后确认_your_app_session(或对应你的应用session cookie名称)已被删除。此时再调用需要登录的查询,应该会抛出"authorization is required"权限错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 12:33:24