RoR框架:控制器继承功能失效问题排查求助
排查API基类控制器继承失效的问题
嘿,我帮你捋捋这个问题——先看你写的authenticate_member_from_token!方法,这里有个逻辑完全颠倒的错误,这大概率是导致继承后验证没生效的核心原因!
你看这段代码:
if !request.headers[:escambo_token] @member = Member.find_by_valid_token(:activate, request.headers['escambo_token']) if !@member render nothing: true, status: :unauthorized end end
它的意思是:只有当请求里没有escambo_token的时候,才会尝试用这个token去查找用户——这完全搞反了啊!没有token的时候根本拿不到值去查询,而真正带了token的请求反而跳过了所有验证逻辑,自然会让你觉得继承功能没生效。
先修复基类的核心逻辑
把验证逻辑改成正常的流程:先检查token是否存在,不存在直接返回未授权;存在的话再用token查找用户,找不到也返回未授权。修复后的代码如下:
class Api::BaseApiController < ApplicationController before_action :parse_request, :authenticate_member_from_token! def index render nothing: true, status: 200 end protected def authenticate_member_from_token! # 先取出请求头里的token token = request.headers[:escambo_token] # 没有token直接返回未授权 unless token render nothing: true, status: :unauthorized return # 提前终止方法,避免后续执行 end # 用token查找合法用户 @member = Member.find_by_valid_token(:activate, token) unless @member render nothing: true, status: :unauthorized end end end
再排查其他可能的继承失效原因
如果修复完逻辑还是有问题,你可以检查这几点:
- 子类是否覆盖/跳过了基类的回调? 要是子类里写了
skip_before_action :authenticate_member_from_token!,那基类的验证肯定不会执行。另外如果子类用before_action添加了自己的回调,只要没刻意跳过基类的,两个回调都会执行,但如果子类的回调提前终止了请求(比如render),也会影响基类回调。 - 命名空间是否正确? 子类是不是真的在
Api命名空间下?比如子类应该写成class Api::SomeChildController < Api::BaseApiController,要是写成class SomeChildController < Api::BaseApiController,虽然继承关系是对的,但路由配置可能会出问题,间接让你误以为继承失效。 - parse_request方法有没有提前终止请求? 如果
parse_request方法里有render或者redirect_to这类会终止请求流程的代码,那后面的authenticate_member_from_token!就不会执行了,你可以检查下这个方法的实现。
内容的提问来源于stack exchange,提问作者olegario
相关产品推荐
相关产品推荐

