Как сделать контроль доступа на основе ролей для франчайзингового бизнеса? - PullRequest
1 голос
/ 23 апреля 2010

Я строю вторую итерацию CRM + CMS на основе веб-технологий для бизнеса по франчайзингу в ASP.NET MVC 2. Мне нужно контролировать доступ к услугам каждой франшизы на основе ролей, назначенных пользователю для этой франшизы. .

4 примера:

  • Receptionist должна иметь возможность заказывать рабочие места для ее франшизы "Atlantic Seaboard", но не делать никаких отчетов.
  • Technician должен иметь возможность изменять служебные задания, но не изменять счета.
  • Managers должен иметь возможность применять скидки к счетам за работу в своих магазинах.
  • Owner должен иметь возможность получать отчеты по всем имеющимся у него франшизам.

Где должен находиться контроль доступа на уровне франшизы между слоями Data - Services - Web?
Если он входит в мои контроллеры, как мне лучше его реализовать?

Частичная схема

Roles класс

int ID { get; set; } // primary key for Role
string Name { get; set; }

Частично Franchises Класс

short ID { get; set; } // primary key for Franchise
string Slug { get; set; } // unique key for URL access, eg /{franchise}/{job}
string Name { get; set; }

UserRoles отображение

short FranchiseID; // related to franchises table
Guid UserID; // related to Users table
int RoleID; // related to Roles table
DateTime ValidFrom;
DateTime ValidUntil;

Реализация контроллера

Контроль доступа с атрибутом [Authorize]

Если бы была задействована только одна франшиза, я мог бы просто ограничить доступ к действию контроллера следующим образом:

[Authorize(Roles="Receptionist, Technician, Manager, Owner")]
public ActionResult CreateJob(Job job)
{
    ...
}

И поскольку франшизы не просто появляются ночью, возможно, это сильный аргумент в пользу использования новой функции Areas в ASP.NET MVC 2? Или это приведет к дублированию просмотров?

Контроллеры, маршрутизация URL и области

При условии, что области не используются, каков будет лучший способ определить, к каким данным франшизы осуществляется доступ? Я думал об этом:

{franchise}/{controller}/{action}/{id}

или лучше определить франшизу задания в действии Details (...) и ограничить действие пользователя с помощью [Authorize]:

{job}/{id}/{action}/{subaction}
{invoice}/{id}/{action}/{subaction}

, что имеет больше смысла, если какой-либо пользователь потенциально может иметь доступ к более чем одной франшизе, не загромождая URL-адрес параметром {franchise}.

Любой вклад приветствуется.

Редактировать:

Фон

Я построил предыдущую CRM в классическом ASP, и она хорошо работает, но пришло время для обновления, чтобы ускорить рабочий процесс и оставить меньше места для ошибок. Для правильного тестирования и лучшего разделения между данными и представлением я решил внедрить шаблон хранилища, как это показано в серии MVC Storefront Роба Конери.

Как организовать сервисы и репозитории?

Имеет смысл иметь JobService, который извлекает любые сервисные задания на основе доступных фильтров, например. IQueryable<Job> GetJobs();. Но поскольку работа может принадлежать только одной франшизе, такая функция, как IQueryable<Job> GetJobs(int franchiseID);, может принадлежать либо к FranchiseService, либо к JobService. Должен ли FranchiseService действовать как CatalogService (как в MVC Storefront)?

1 Ответ

0 голосов
/ 28 апреля 2010

Позвольте мне ответить на этот вопрос. Я нахожусь в процессе игры с примером приложения, которое затрагивает некоторые из упомянутых аспектов. Это не авторитетный ответ, просто опыт.

Где должен находиться контроль доступа на уровне франшизы между уровнем данных - услуги - веб-уровень?

Это ограничение доступа должно проникли через ваше приложение в два уровня 1) база данных 2) прикладной уровень. В контексте MVC я предложил бы создать обычай Атрибут авторизации - это обрабатывает безопасность между веб-сервисами слой. Я бы этот атрибут сделал две вещи

  1. Получить текущие роли, разрешенные для пользователя (либо из БД этого может храниться в сеансе пользователя)
  2. Выполните проверку, чтобы определить, является ли пользователь частью разрешенного списка ролей. Что касается базы данных, это зависит от того, как вы храните данные, одна база данных для всех франшиз или база данных по франшизе. в В первом случае есть несколько способов ограничения и настроить ограничения доступа для данные для конкретного франшизы.

Поскольку франшизы не появляются только ночью, может быть, это сильный аргумент в пользу использования новой функции областей в ASP.NET MVC 2? Или это приведет к дублированию просмотров?

Я думаю, что Области должны быть использованы для сплит и групповая функциональность. если ты должны были использовать области для разделения франшиз, это где я вижу дублирование представления, контроллеры и т. д. встречаются. дублировать взгляды могут быть преодолены с помощью пользовательский вид движка специально переопределение того, как MVC находит ваш Просмотры. Plug: Смотрите мой ответ на ASP.NET MVC: индивидуальный дизайн для домена

При условии, что области не используются, каков будет лучший способ определить, к каким данным франшизы осуществляется доступ?

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

Создайте свои маршруты и т.д. для норм и не для исключения. например. Есть В настоящее время бизнес-кейс, который говорит пользователь может иметь доступ к более чем одному франшизы?

Как организовать сервисы и репозитории?

Есть набор базовых услуг или базы классы, которые будут содержать все информация, необходимая для конкретного франшизы, такие как franchiseId. Основная проблема, которую он решает, что ваши методы обслуживания чище не имея аргумента franchiseId. Однако хранилище может нуждаться в этом значение, так как в какой-то момент вам нужно устранять неоднозначность данных, которые вы запрос или хранение (при условии, что один дБ для всех франшиз). Тем не менее, вы может преодолеть некоторые из них с помощью IoC.

Недостатком, который я вижу, является то, что они всегда будут звонить база данных каждый раз, когда ваши объекты создание (т.е. если franchise маршрут должен был быть использован, вам нужно пойти в базу данных, чтобы получить соответствующий франшизы каждый раз Вы создаете сервисный объект. ( Я мог бы ошибиться в этом, так как IoC Контейнеры имеют некоторый LifeStyle варианты, которые могут быть в состоянии помочь и предотвратить это) Вы могли бы иметь список франшиз, которые созданы на вас приложение запускается, что вы можно использовать для сопоставления значений вашего маршрута получить правильную информацию. это часть ответа разбросана, но главное что IoC поможет Вы отделяете много зависимостей.

Надеюсь, это поможет ..

...