2012-04-25 3 views
1

У меня есть приложение, которое нуждается в капитальном ремонте его системы разрешения.Предложения для подробных разрешений приложений Архитектура

Это приложение имеет 2 типа «сущностей», которые необходимо обеспечить:

  • Пользователи
  • Компании

Пользователи просты, они просто роли, которые дают им доступ к областям в пределах приложения, данные не будут изменены.

Компании могут быть одного из трех типов - административных (в настоящее время только «ведущей» компанией, которая владеет продуктом), партнерами (реселлерами продукта) и стандартом (люди просто используют продукт).

Продукт также имеет концепцию «Группы» компаний, поскольку реселлеры могут продавать продукт под разными именами, но должны иметь возможность видеть все данные одновременно. Поэтому каждая компания всегда принадлежит группе, и каждая группа, в свою очередь, принадлежит компании.

При запросе данных, у меня есть несколько требований:

  • Если пользователь, принадлежащий к реселлером компании A запрашивает данные, все компании во всех группах, которые реселлер владеет должны показать
  • Если пользователь, принадлежащий к стандартной компании B, запрашивает данные, они должны видеть только их информацию.
  • Если пользователь, принадлежащий административной компании C, запрашивает данные, они должны видеть все.
  • Наконец, фактические данные, которые были показаны, должны быть отфильтрованы по типу компании - административные компании больше данных, чем посредники, которые видят больше информации, чем обычные компании

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

List<int> groups; 
if(CompanyType == CompanyType.Reseller){ 
    groups = [some list of groups] 
}else{ 
    .... 
} 

Который довольно некрасиво и подверженные ошибки.

Мы используем SubSonic, WCF (вся система разработана с интерфейсом REST), PostSharp и C#, поэтому вы знаете доступные инструменты.

Может ли кто-нибудь предложить хороший способ реализовать разрешения с этим уровнем детализации (строка и столбец, по существу) на уровне фрейма, чтобы гарантировать, что ограничения установлены соответствующим образом и автоматически?

ответ

0

Я работал над аналогичной проблемой. В основном, мой псевдо-алгоритм был:

IEnumerable<MyData> allDatas = DataAccessLayer.GetDatas(); 
IEnumerable<MyData> filteredDatas = RuleEngine.Filter(allDatas); 
// filteredDatas contains only the datas that the user is authorized to view 

Сначала я получаю, например, все продукты из базы данных. Затем я фильтрую их с помощью бизнес-правил. Вероятно, вам придется добавить некоторые параметры в RuleEngine.Filter: текущий пользователь и, возможно, некоторые контекстуальные данные.

Для того, чтобы получить двадцать продуктов, вы можете написать код, как этот:

IDataReader reader = GetReader(); 
var products = new List<Product>(); 
while(reader.Read() && products.Count < 20) 
{ 
    var product = BuildProduct(reader); 
    if(RuleEngine.Filter(new Product[] { product }).Any()) 
     products.Add(product); 
} 
+0

Какие хитов производительности ли это ввести хотя?Если у меня есть таблица со 100 000 записей, я хочу, если это возможно, фильтровать на уровне базы данных ... – jvenema

+0

У вас есть сценарий, когда вам нужно будет загрузить 100 000 записей? Вы, вероятно, будете, например, для своих продуктов, фильтровать их по категориям и некоторым другим критериям. – schglurps

+0

Много времени это всего лишь фильтр топ-20, поэтому у меня есть запрос, который ограничивает его там ... в противном случае я должен запросить top-X и надеюсь, что фильтр не вернет меньше 20 :) – jvenema