2012-04-15 2 views
0

Я пишу сайт в MVC3, используя Entity (связанный с Postgres, но не уверен, что часть имеет отношение.Фильтрация данных с помощью прав доступа Пользователя

Пользователь является частью ряда «лиг», и создает «событие» против одной из этих лиг.

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

Теперь существует множество способов, которыми это может быть достигнуто, но я ищу самые элегантные и общепринятые для быть «правильным способом».

В настоящее время отношения пользователя -> лиги хранятся в том же месте, что и остальные данные, поэтому я могу просто фильтровать лиги без проблем. Моя проблема в том, что я не уверен, должен ли я получать доступ к HttpContext, чтобы заставить userId на уровне репозитория выполнять фильтрацию.

Если я не делаю вышеизложенного, я рассматривал возможность использования функции RoleMembership и создания лиг, ролей, а затем для ее создания встроены функции.

Вопрос в том, что лучше всего подходит для фильтрации данных результатов пользователем Доступ в MVC3/Entity?

Блоги/Учебник ссылки являются предпочтительными, но полные ответы также могут быть приняты ...

ответ

1

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

Таким образом, хранилище является автономным; поставщик роли имеет зависимость (я собираюсь из вашего вопроса) по HttpContext; и модель представления имеет зависимость как от репозитория, так и от поставщика ролей. Я хотел бы подчеркнуть, что вы пишете обертывание зависимостей любых методов HttpContext, которые вы планируете использовать, чтобы облегчить тестирование.

Там есть довольно обширный учебник по зависимости закачкой и MVC, на MSDN: http://msdn.microsoft.com/en-us/gg618491

Для иллюстрации:

public interface ILeagueRepository 
{ 
    IEnumerable<League> All; 
} 

public interface ILeaguesProvider 
{ 
    IEnumerable<League> GetUserLeagues(string Username); 
} 

public class LeaguesProvider : ILeaguesProvider 
{ 
    public LeaguesProvider(ILeagueRepository repository) 
    { 
     // ... 
    } 
    public IEnumerable<League> GetUserLeages(string Username) 
    { 
     return _repository.All.Where(league=>league.User == Username); 
    } 
} 

public ActionResult LeaguesController 
{ 
    public LeaguesController(ILeaguesProvider providerDependency, IRoleProvider roleDependency) 
    { 
     IEnumerable<League> leagues = providerDependency.GetUserLeagues(roleDependency.GetCurrentUser()); 
    } 
} 
+0

Я использую Ninject для DI, так что это не проблема. Я все еще не уверен, где применяется фильтр ... можете ли вы расширить это? – Martin

+0

@Martin Я добавил приблизительный эскиз того, что я имел в виду, надеюсь, это поможет. Ключевой момент, который я пытаюсь сделать, - не смешивать зависимость роли в репозитории и никогда не кодировать напрямую против HttpContext, а против зависимости, которую вы определяете. – McGarnagle

Смежные вопросы