Существует ли наилучший подход к внедрению пользовательских ролей при использовании маршрутов ресурсов RESTful?Структура приложения для ресурсов RESTful на основе ролей
Скажет, у меня есть следующие ресурсы:
User has_many Tickets
Event has_many Tickets
Ticket belongs_to Person, Event
А затем еще у меня есть два типа пользователей: клиенты и агенты. Оба входа будут входить в систему, но с различным доступом к ресурсам и функциональностью, основанной на их ролях. Например:
Клиентов могут получить доступ:
- индекса событий, показать
- индекса билетов (область действия пользователя), шоу, купить/создать, возврат/удалить
- Людей создания, шоу, обновление
Агенты могут получить доступ к:
- Индекс события, шоу, создание, обновление, удаление
- индекса билетов, шоу, продажа/создание, обновление, возврат/удалить
- индекс Person, шоу, создавать, обновлять, удалять
Какие из 4-х общие подходы ниже будут более чистыми и более гибкими?
Отдельные контроллеры в роли папок и ресурсов в пространствах имен, например:
namespace "agent" do
resources :events, :tickets, :people
end
namespace "customer" do
resources :events, :tickets, :people
end
Отдельные контроллеры по роли, например:
AgentController
def sell_ticket, etc
CustomerController
def buy_ticket, etc
Общие контроллеры с отдельными действиями в случае необходимости, например:
TicketController
before_filter :customer_access, :only => :buy
before_filter :agent_access, :except => :buy
def buy #accessed by customer to create ticket
def sell #accessed by agent to create ticket
Общие действия с условными операторами, например:
TicketController
def create
if @role == :customer
#buy ticket
elsif @role == :customer
#sell ticket
end
end
Модель не знает о пользователе, который прошел аутентификацию. Обычно это управляется контроллером. Кроме того, ОП задает вопрос о наилучшем способе защиты. Это невозможно настроить в представлениях. Как насчет соединений API? Как вы обеспечиваете безопасность для разных ролей пользователя там? Вы не хотите повторять код, поэтому он должен находиться в центральном месте, т.е. контроллере. Итак, вопрос в том, как вы можете разумно управлять своим контроллером, чтобы добавить такой тонкий контроль над ролями и разрешениями пользователей. –