Вопрос аутентификации Merb
Мое приложение имеет пользовательскую часть и /admin часть. Есть 2 модели учетной записи (например, клиента) и администратора, и я должен аутентифицировать учетную запись и администратора отдельно. Администраторы не должны иметь доступ к части учетной записи и учетные записи не должны иметь доступ к области администратора. Есть ли какое-то решение для меня, или я должен написать 2 разных приложения для пользователей и администраторов, а затем ждать Merb 1.1 и монтировать их как-то в 1 приложение? Есть идеи?
1 ответ
Ваш вопрос мне кажется очень интересным, у меня были такие же проблемы в начале. Таким образом, я могу предложить различные решения, из которых вы можете выбрать одно, в зависимости от структуры вашего приложения.
Если все ваши пользователи принадлежат к одному классу, но имеют специальное поле (например, UserClass = (:client,:moderator,:admin и т. Д.), У вас будет минимум модификаций приложения, просто проверьте параметр класса пользователя в ваших контроллерах / представлениях. Я думаю, что это не очень хорошая идея для вас.
Лучшая практика - использовать стратегии аутентификации Merb. Это очень гибкий механизм, поэтому вы можете выбирать классы, с которыми хотите работать.
Например, у вас есть 2 основных стратегии: ClientAuth, AdminAuth. Оба они будут использовать разные пользовательские классы (Client, Admin). Все, что вам нужно - создать файл пользовательской стратегии и затем подключить его к маршрутизатору следующим образом:
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
Только потому, что вы установили разные классы аутентификации (Admin, Client) для своих стратегий, вы сможете получить информацию об этом: session.user.class (это основной метод ruby для определения имени класса объекта)
Вот несколько полезных ссылок: