Вопрос аутентификации Merb

Мое приложение имеет пользовательскую часть и /admin часть. Есть 2 модели учетной записи (например, клиента) и администратора, и я должен аутентифицировать учетную запись и администратора отдельно. Администраторы не должны иметь доступ к части учетной записи и учетные записи не должны иметь доступ к области администратора. Есть ли какое-то решение для меня, или я должен написать 2 разных приложения для пользователей и администраторов, а затем ждать Merb 1.1 и монтировать их как-то в 1 приложение? Есть идеи?

1 ответ

Решение

Ваш вопрос мне кажется очень интересным, у меня были такие же проблемы в начале. Таким образом, я могу предложить различные решения, из которых вы можете выбрать одно, в зависимости от структуры вашего приложения.

  1. Если все ваши пользователи принадлежат к одному классу, но имеют специальное поле (например, UserClass = (:client,:moderator,:admin и т. Д.), У вас будет минимум модификаций приложения, просто проверьте параметр класса пользователя в ваших контроллерах / представлениях. Я думаю, что это не очень хорошая идея для вас.

  2. Лучшая практика - использовать стратегии аутентификации 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 ​​для определения имени класса объекта)

Вот несколько полезных ссылок:

  1. http://www.slideshare.net/hassox/merb-auth-presentation
  2. http://merbunity.com/tutorials/19
  3. http://www.slideshare.net/carllerche/merb-pluming-the-router-presentation
  4. http://merbivore.com/documentation/1.0/doc/rdoc/merb-auth-core-1.0/index.html?a=C00000025&name=Strategy
Другие вопросы по тегам