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, и я хочу иметь возможность использовать единый доступ для всех моих действий.