Разработайте логин с моделями пользователей или администраторов и поддоменами в стиле Basecamp - PullRequest
5 голосов
/ 06 января 2011

У меня есть отдельные модели для пользователей и администраторов Devise. Я также использую поддомен в стиле Basecamp. Все работает хорошо, за исключением нескольких контроллеров и действий, где мне нужно иметь возможность аутентифицироваться как пользователь или как администратор.

В настоящее время у меня есть authenticate_user! установить в моем application_controller.rb, и я пропускаю его с skip_before_filter для тех контроллеров и действий, к которым только администраторы должны иметь доступ.

К сожалению, я не могу просто указать требование аутентификации на каждом контроллере, так как мне все еще потребуются некоторые контроллеры и действия для доступа как пользователя, так и администратора.

Я попробовал несколько вещей безрезультатно. Кажется, что если я перееду authenticate_user! и authenticate_admin! в какую-то логику обнаружения поддоменов, которую он не может обработать. В основном:

current_subdomain = request.subdomains.first    
if current_subdomain == 'admin'
 authenticate_admin!
else
 authenticate_user!
end

В какой-то момент я смог заставить его выполнить попытку аутентификации, но по какой-то причине он не смог исключить необходимость аутентификации контроллера сеанса, что привело к циклу перенаправления (впервые для меня с Ruby!).

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

  • Рубин 1.9.2
  • Рельсы 3.0.3
  • Разработка 1.1.3

Ответы [ 3 ]

14 голосов
/ 11 января 2011

Попробуйте написать свой собственный фильтр перед фильтрацией в соответствии с

#application_controller.rb
def authenticate_any!
    if admin_signed_in?
        true
    else
        authenticate_user!
    end
end

, затем в контроллере, где вы хотите, чтобы и администраторы, и пользователи могли иметь доступ через аутентификацию, используйте

#myobject_controller.rb
before_filter :authenticate_any!

Если вы вошли в систему как администратор, то вы передадите before_filter, в противном случае вы пройдете authenticate_user!что является поведением по умолчанию.

10 голосов
/ 02 апреля 2011

На самом деле это не работает:

#application_controller.rb
def authenticate_any!
    if admin_signed_in?
        true
    else
        authenticate_user!
    end
end

Запустится бесконечная рекурсия для аутентифицируемого пользователя ..

Попробуйте вместо этого:

def authenticate_user!
  return if admin_signed_in?
  super
end

Простопомните, что с этим вторым решением вы говорите что-то вроде этого: «Вы должны войти в систему как минимум пользователь», и вы потеряете аутентификацию только пользователей.

Администраторы смогут получить доступ ко всему.

1 голос
/ 06 января 2011

Может быть, вам стоит подумать о дополнительном геме - CanCan для обработки ролей

Довольно мило описано здесь: http://www.tonyamoyal.com/2010/09/29/rails-authentication-with-devise-and-cancan-part-2-restful-resources-for-administrators/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...