Я строю вторую итерацию 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)?