2015-03-06 10 views
1

Я использую ActiveAdmin с пользовательской моделью User (без Devise) и обычным SessionsController. Я успешно установил ActiveAdmin, внедрил необходимые методы, но столкнулся с проблемой: после первого посещения приборной панели, пользователи remember_token удалены из файлов cookie (я нашел его в браузере), что приводит к выходу пользователя из системы и переадресации на главную страницу сайта.Rails + ActiveAdmin с пользовательской моделью пользователя (без разработки):

В журналах Rails следующие изменения в модели пользователя:

D, [2015-03-06T18:08:38.412548 #29316] DEBUG -- : User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = $1 ORDER BY login ASC LIMIT 1 [["remember_token", "d983c4abdc252ffc04a71260513ace78534a4c2b"]] 
D, [2015-03-06T18:08:38.538903 #29316] DEBUG -- : (0.1ms) BEGIN 
D, [2015-03-06T18:08:38.539994 #29316] DEBUG -- : SQL (0.2ms) UPDATE "users" SET "remember_token" = $1, "updated_at" = $2 WHERE "users"."id" = $3 [["remember_token", "5c40d43f2df2a0dfcbd0bc3a40496bf3eb5bf8a7"], ["updated_at", "2015-03-06 14:08:38.539165"], ["id", 22]] 
D, [2015-03-06T18:08:38.593651 #29316] DEBUG -- : (53.4ms) COMMIT 
D, [2015-03-06T18:08:38.594675 #29316] DEBUG -- : User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = $1 ORDER BY login ASC LIMIT 1 [["remember_token", "da39a3ee5e6b4b0d3255bfef95601890afd80709"]] 

конфигурации/инициализаторов/active_admin.rb

ActiveAdmin.setup do |config| 
    config.site_title = "Coordinate" 
    config.authentication_method = :authenticate_admin_user! 
    config.logout_link_path = :sign_out 
    config.logout_link_method = :delete 
    config.batch_actions = true 
end 

приложение/контроллеры/application_controller.rb

def authenticate_admin_user! 
    unless current_admin_user 
     flash[:error] = "Access error!" 
     redirect_to root_path 
    end 
    end 

    def current_admin_user 
    return nil if signed_in? && !current_user.admin? 
    current_user 
    end 

app/helpers/sessions_helper.rb

def sign_in(user) 
    remember_token = User.new_remember_token(); 
    cookies.permanent[:remember_token] = remember_token; 
    user.update_attribute(:remember_token, User.encrypt(remember_token)); 
    self.current_user=user; 
    end 

    def current_user 
    remember_token= User.encrypt(cookies[:remember_token]); 
    @current_user ||= User.find_by(remember_token: remember_token); 
    end 


    def current_user?(user) 
    user==current_user; 
    end 

    def signed_in? 
    !current_user.nil? 
    end 

    def sign_out() 
    current_user.update_attribute(:remember_token, User.encrypt(User.new_remember_token)); 
    cookies.delete(:remember_token); 
    self.current_user=nil; 
    end 

Помогите решить эту проблему.

ответ

0

Я решил установить значения config.logout_link_path = false в файле конфигурации ActiveAdmin

1

current_user is nil. Правильно?

Похоже, вы не инициализируете его базой на remember_token из файлов cookie. Вы должны инициализировать его в методе authenticate_admin_user!.

+0

справа, '' current_user' является nil'. Но как оно инициализируется, если файлы cookie пустые? – 0xDEADBEEF

+0

«Ваше приложение может хранить небольшие объемы данных на клиенте - куки-файлы cookie - **, которые будут сохраняться в запросах и даже сеансах **» - из [здесь] (http://guides.rubyonrails.org/action_controller_overview.html #печенье). Это означает, что ваш 'remember_token' должен быть в файлах cookie (Rails анализирует заголовок Cookie во время запроса и инициализирует свойство' cookies'). Попробуйте вывести значения «cookie» и проверить его. –

+0

После 'sign_in' мой' remember_token' хранится в файлах cookie и доступен на разных страницах моего приложения. Но после ввода на приборной панели «remember_token» в модели «Пользователь» изменяется и удаляется из файла cookie. Не знаю, почему. Но cookie 'authenticate_admin_user!' Не содержит 'remember_token'. – 0xDEADBEEF

Смежные вопросы