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
相关产品推荐
相关产品推荐

