Разработайте вход с помощью пользователей или моделями администратора и поддоменов в стиле Basecamp

StackOverflow https://stackoverflow.com/questions/4612545

Вопрос

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

В настоящее время у меня есть аутентификация_ прозел! Установите в моем приложении_Controller.RB, и я пропускаю его с помощью Skip_before_filter для тех контроллеров и действий, которые должны иметь только администраторы.

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

Я пробовал несколько вещей безрезультатно. Похоже, что если я переместим аутентиковать_ прозор! и uptedicity_admin! В какую-то логику обнаружения поддоменов не выполняется. В принципе:

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

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

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

  • Ruby 1.9.2
  • Рельсы 3.0.3
  • Разработание 1.1.3
Это было полезно?

Решение

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

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

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

#myobject_controller.rb
before_filter :authenticate_any!

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

Другие советы

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

#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

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

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

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

Приятно описано здесь:http://www.tonyamaMoyal.com/2010/09/29/rails-authentication-with-devise-and-cancan-part--restful-resources-form-administrators/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top