2013-08-28 2 views
4

Я использую Devise и CanCan для аутентификации пользователей и администрирования ролей, ограничивающих доступ к частям моего приложения Rails 4 для определенных пользователей.Почему сеанс current_user становится нулевым при обновлении пользователя?

У меня возникли проблемы с обновлением пользователя. Обновление работает нормально, и пользовательский объект в db обновляется по мере необходимости, но мой сеанс пользователя теряется при следующем redirect_to действии моего действия пользователя. current_user становится nil, что означает, что CanCan ограничивает доступ к действию пользователя.

Почему current_user стал nil после обновления, если это не происходит при других действиях (например, создавать, уничтожать и т. Д.)?

Эти настройки DEViSE в моей модели пользователя:

devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable, :authentication_keys => [:login] 

Это метод обновления моего users_controller.rb в:

class UsersController < ApplicationController 

    load_and_authorize_resource 
    before_filter :authenticate_user! 

    def update 
    @user = User.find(params[:id]) 
    if params[:user][:password].blank? 
     params[:user].delete(:password) 
    end 

    respond_to do |format| 
     if @user.update_attributes(user_params) 
     format.html { redirect_to user_path, :notice => 'User was successfully updated.' } 
     format.json { head :ok } 
     else 
     format.html { render :action => "edit" } 
     format.json { render :json => @user.errors, :status => :unprocessable_entity } 
     end 
    end 
    end 
end 

И это мой ability.rb файл:

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new # guest user (not logged in) 
    if defined?(user.role_id) 
     if user.role? :admin, user.role_id 
     can :manage, :all 
     elsif user.role? :hauler, user.role_id 
     can :manage, [User,Trip,Invoice], user_id: user.id.to_s 
     else 
     can :create, :Trip 
     end 
    end 
    end 
end 

ответ

4

Это зависит от выполняемого обновления. Сеансы сериализуются с определенными битами пользовательских данных.

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

+0

Благодаря трг. Переадресация работает нормально, если я обновляю пользователя без обновления пароля. Итак, согласно тому, что вы говорите, мне нужно снова войти в систему, если он или она изменяет пароль, правильно? – asprotte

+0

да - в частности 'sign_in @user,: bypass => true' - вы можете увидеть больше информации здесь: https://github.com/plataformatec/devise/wiki/How-To%3a-Allow-users-to- edit-their-password – trh

+0

Отлично, что работает! Спасибо, тр! – asprotte

0

Работал для меня

def update 

    respond_to do |format| 

     if @user.update(user_params) 

     sign_in(@user, :bypass=>true) 

     format.html { redirect_to @user, notice: 'User was successfully updated.' } 
     format.json { render :show, status: :ok, location: @user } 

     else 
     format.html { render :edit } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
     end 

    end 

end 

Магия происходит в: байпас => верно

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