Authlogic и Pundit проблема - Current_user не заполняется

У меня возникла следующая проблема с моим сайтом. Я создаю кучу вызовов API, которые могут использоваться другими, но в первую очередь интерфейсом. Моя проблема по какой-то причине кажется, что Authlogic не аутентифицирует моего пользователя до вызова контроллера и pundit. Самое смешное, что это происходит только с TrackingController и ни один из других.

Мне пришлось немного поработать, чтобы Authlogic аутентифицировался в заголовке, а не в параметре url. Опять же, это прекрасно работает в моем ShiftsController но не будет работать в моем TrackingController,

Я был в состоянии отследить, что это отсутствие user объект, который вызывает CalShiftArchivePolicy к ошибке. если я закомментирую строку 5, код остановится на строке 11 с ошибкой:

"неопределенный метод`has_roles?' для ноля:NilClass"

любая помощь будет отличной.

Ruby версия 2.1.5p273, Rails версия 4.1.8

В моем контроллере у меня есть:

class TrackingController < ApplicationController
  include Pundit
  after_action :verify_authorized

  def index
    @tracking = CalShiftArchive.where("cal_shift_id = :id", :id => params[:shift_id])
    authorize @tracking, :index?
  end

end

Политика Pundit:

class CalShiftArchivePolicy < ApplicationPolicy
  attr_reader :user, :tracking

  def initialize(user, shifts)
    raise Pundit::NotAuthorizedError, "must be logged in" unless user
    @user = user
    @tracking = :tracking
  end

  def index?
    user.has_roles?("CalAdmin")
  end

конец

Контроллер приложений:

class ApplicationController < ActionController::Base
  include Pundit
  before_filter :api_logon
  helper_method :current_user_session, :current_user
  before_filter :set_current_user
  protect_from_forgery with: :exception 
  rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized

  def current_user_session
    return @current_user_session if defined?(@current_user_session)
    @current_user_session = UserSession.find
  end

  def current_user
    return @current_user if defined?(@current_user)
    @current_user = current_user_session && current_user_session.user
  end

  protected

  def permission_denied
    flash[:error] = "Sorry, you are not allowed to access that page."
    redirect_to root_url
  end

  def api_logon
    if request.headers["apiKey"]
      params['user_credentials'] = request.headers["apiKey"]
    end
  end

  private

  def user_not_authorized 
    respond_to do |format|
      format.html do
          flash[:error] = "You are not authorized to perform that action action."
          redirect_to(request.referrer || root_path)
      end
      format.xml  { render :xml => "<error>You are not authorized to access that resource</error>", :status => 403 }

      format.json { render :json => 
            {:error => "You are not authorized to access that resource "}.to_json, 
             :status => 403 }
    end
  end
  #----------------- Model Current_user workaround
  # passes the current_user object to a thread safe 
  # object that can be accesssed in models.
  def set_current_user
    User.current_user = current_user
  end
end

Маршрутизация:

Rails.application.routes.draw do

  #root rout - main page location
  root to:  'welcome#index'

  #Login and Logout routes
  resources :user_sessions
  get 'login' => 'user_sessions#new', :as => :login
  get 'logout' => 'user_sessions#destroy', :as => :logout

  resources :users do
      patch 'suppress', on: :member
      patch 'unsuppress', on: :member
      patch 'activate', on: :member
      patch 'lock', on: :member
      patch 'unlock', on: :member
      patch 'password', on: :member
  end
  resources :shifts, except: [:new, :edit] do
      patch 'submit', on: :member
      patch 'acquire', on: :member  
      resources :tracking, except: [:new, :edit, :destroy, :update, :create]
  end
end

1 ответ

Простой ответ - глупость.

Я забыл, что когда вы используете authlogic и параметр одиночного токена доступа, который необходимо очистить каждый контроллер для использования единственного токена доступа, добавив следующий класс:

  def single_access_allowed?
      true
  end

Я передаю true вместо хэша разрешенных представлений, потому что все мои представления - это вызовы API, и я хочу иметь возможность использовать единый доступ для всех моих действий.

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