Вопрос по аутентификации Merb
Вопрос
Мое приложение имеет пользовательскую часть и часть /admin.Существует две модели учетной записи (например, клиента) и администратора, и мне следует аутентифицировать учетную запись и администратора отдельно.Администраторы не должны иметь доступ к части учетной записи, а учетные записи не должны иметь доступ к административной области.Есть ли какое-нибудь решение для меня, или мне следует написать 2 разных приложения для пользователей и администраторов, а затем дождаться merb 1.1 и как-то смонтировать их в 1 приложение?Есть идеи?
Решение
Ваш вопрос мне кажется очень интересным, вначале у меня были такие же проблемы.Итак, я могу предложить различные решения, из которых вы можете выбрать одно, в зависимости от структуры вашего приложения.
Если все ваши пользователи принадлежат к одному классу, но имеют специальное поле (например, UserClass = (:client, :moderator, :admin и т. д.), у вас будет минимум модификаций приложения, просто проверьте параметр класса пользователя в ваших контроллерах/представлениях.Я думаю, что это не лучшая идея для тебя.
Лучшая практика — использовать стратегии аутентификации Merb.Это очень гибкий механизм, поэтому вы можете выбирать классы, с которыми хотите работать.
Например, у вас будет 2 основные стратегии:КлиентАут, АдминАут.Оба они будут использовать разные классы пользователей (Клиент, Администратор).Все, что вам нужно — создать собственный файл стратегии и затем подключить его к маршрутизатору следующим образом:
authenticate(ClientAuth) do
match('/profile').to(:controller => ProfileController)
end
authenticate(AdminAuth) do
match('/admin').to(:controller => AdminController)
end
Или вы можете использовать аутентификацию внутри контроллера:
class AdminController
:before ensure_authenticated, :with => [AdminAuth]
def index
... your stuff ...
end
end
Кроме того, вы даже можете использовать только один контроллер для аутентификации для обоих классов, используя обе стратегии следующим образом:
class AdminController
:before ensure_authenticated, :with => [AdminAuth, ClientAuth]
end
Просто потому, что вы установили разные классы аутентификации (Администратор, Клиент) для своих стратегий, вы сможете получить информацию об этом:session.user.class (это базовый метод Ruby для определения имени класса объекта)
Вот несколько полезных ссылок: