RoR: Почему наследование не работает для контроллера?

У меня есть следующий контроллер для моего приложения:

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!
      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
    end

Затем у меня есть другой контроллер, который наследуется от этого контроллера:

class Api::CategoryController < Api::BaseApiController
  before_action :find_category, except: [:index]

  def index
    @category = Category.all
    puts(@category)
    render json: @category
  end

Но контроллер разрешает запросы без токена.

ИЗМЕНИТЬ 1: почему-то действие index начало работать нормально. Но все еще не проверяю токен.

РЕДАКТИРОВАТЬ 2: способ фиксации с private на protected

@SergioTulentsev уже исправлен! Спасибо.

olegario 04.04.2018 19:11

вы уверены, что он использует правильные методы? вы можете поставить точки прерывания, чтобы гарантировать, что они будут вызваны

max pleaner 04.04.2018 19:11

@maxpleaner Я снова отредактировал вопрос.

olegario 04.04.2018 19:14

@olegario: значит, вы говорите, что он не входит в authenticate_member_from_token!? Откуда вы знаете? Входит ли в parse_request?

Sergio Tulentsev 04.04.2018 19:15

Если authenticate_member_from_token! не вызывается, значит, в приведенном выше коде не хватает чего-то важного. Я не вижу причин, почему бы это не называлось.

Tom Lord 04.04.2018 19:16

@TomLord, он вызывается, но я отправляю фальшивый токен (недействительный), и метод принимает.

olegario 04.04.2018 19:21

@olegario Работает ли parse_request перед действием в Api::CategoryController#index?

Martin Zinovsky 04.04.2018 19:23

@MartinZinovsky, да, это так.

olegario 04.04.2018 19:25

@olegario Хорошо, но это именно то, что говорил ваш код ... Я напишу ответ, если то, что я считать вы хотите, ниже ...

Tom Lord 04.04.2018 19:25

@olegario А authenticate_member_from_token! работает, если в Api::CategoryController явно добавить?

Martin Zinovsky 04.04.2018 19:27

@MartinZinovsky, сейчас он работает нормально, но теперь я отправляю заголовок с поддельным токеном, и метод отвечает с кодом состояния 400: request.headers['escambo_token'] = "#{@member.tokens.last.token}"

olegario 04.04.2018 19:33

@olegario: :escambo_token != 'escambo_token', в общем. Не знаю, как headers с этим справляется.

Sergio Tulentsev 04.04.2018 19:36

@olegario попробуйте подход, предложенный в этот ТАК вопрос. request.headers['HTTP_ESCAMBO_TOKEN'] или request.headers['escambo-token']

Martin Zinovsky 04.04.2018 19:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
13
157
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш код должен отображать :unauthorized, если токен отсутствует ИЛИ недействителен. Другими словами, вам нужно, чтобы код был примерно таким:

def authenticate_member_from_token!
  unless Member.find_by_valid_token(:activate, request.headers['escambo_token'])
    render nothing: true, status: :unauthorized
  end
end

Однако с помощью этого кода вы можете столкнуться с двойным рендерингом в контроллере. Более чистый подход может заключаться в том, чтобы вместо этого вызвать исключение, затем спастись от него и соответствующим образом отобразить - например,

EscamboTokenInvalid = Class.new(StandardError)
rescue_from EscamboTokenInvalid, with: :escambo_unauthorized

def authenticate_member_from_token!
  unless Member.find_by_valid_token(:activate, request.headers['escambo_token'])
    raise EscamboTokenInvalid
  end
end

def escambo_unauthorized
  render nothing: true, status: :unauthorized
end

Здесь нет двойного рендеринга. Если before_action отображает (или перенаправляет), действие не выполняется.

Sergio Tulentsev 04.04.2018 19:33

Ах, достаточно честно. Причуды рельсов ..... Тем не менее, обычная практика - вызывать исключение, чтобы можно было задать индивидуальную обработку по желанию.

Tom Lord 04.04.2018 19:34

Другие вопросы по теме