Рельсы 3.2 & Завещание: обычай authenticate_user! это подтверждает подлинность Пользователей и Администраторов

I am using devise with two separate models for User and Admin. I wanted to replace authenticate_user! with my own function, auth_user! such that an Admin's permissions is a superset of the User's permissions. I also wrote a function, actions_permitted, that makes it easier to call skip_before_filter. My added code in ApplicationController.rb is below. For example, I use it in a controller by writing: actions_permitted :public => [:show], user: [:new, :create].

Однако код не функционирует как ожидалось: некоторые действия правильно не заверены, и другие требуют, чтобы администратор также регистрировался как пользователь, когда у администратора должны всегда быть пользовательские способности. После некоторого googling я подозреваю, что проблема может быть то, что, когда унаследованные модели называют actions_permitted, это происходит на уровне ApplicationController, а не в конкретной модели. Я также нашел, что многие на Stackoverflow рекомендовали CanCan, хотя я предпочту придерживаться простого синтаксиса actions_permitted, если можно помочь мне получить его работа!

# app/controllers/application_controller.rb
#
# call with :user and :public defined as either :all or an array
# of symbols that represent methods. Admins can do everything that users
# can (by definition of auth_user!).
def self.actions_permitted(hash)
  # first process exceptions to user authentication
  if hash[:public] == :all
    # skip all filters and return
    skip_before_filter :auth_user!
    skip_before_filter :authenticate_admin!
    return
  elsif hash[:public].kind_of?(Array)
    # skip user authentication for methods in :public array
    skip_before_filter :auth_user!, only: hash[:public]
  end

  # then process exceptions to admin authentication
  if hash[:user] == :all
    # users can do everything, so skip all admin authenticatoin
    skip_before_filter :authenticate_admin!

  elsif hash[:user].kind_of?(Array)
    if hash[:public].kind_of?(Array)
      # Join the two arrays and skip admin authentication as not to filter
      # actions allowed by the public or by users
      skip_before_filter :authenticate_admin!, only: (hash[:user] | hash[:public])
    else
      # otherwise, simply skip admin authentication for actions allowed by users
      skip_before_filter :authenticate_admin!, only: hash[:user]
    end

  elsif hash[:public].kind_of?(Array)
    # skip admin authentication for actions allowed by the public
    skip_before_filter :authenticate_admin!, only: hash[:public]
  end

end

# checks if user OR admin is authenticated.
def auth_user!(opts = {})
  # return (authenticate_user! || authenticate_admin!)
  return (env['warden'].authenticated?(:user) ||
          env['warden'].authenticated?(:admin))
end
2
добавлено
Просмотры: 2
nl ja de

1 ответы

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

def auth_user!(opts = {})
  if admin_signed_in?
    authenticate_admin!
  else
    authenticate_user!
  end
end
3
добавлено