Как работать с ролями (asp.net) без их жесткого кодирования? - PullRequest
5 голосов
/ 05 сентября 2011

Когда роли создаются / удаляются, я не хочу изменять код.

if (HttpContext.Current.User.IsInRole("Super Admin") ||
    HttpContext.Current.User.IsInRole("Admin") ||
    HttpContext.Current.User.IsInRole("Support"))
{
    if (HttpContext.Current.User.IsInRole("Admin"))
    {
        ListBox1.DataSource = Roles.GetAllRoles().Except(
            new[] { "Super Admin" });

    }
    if (HttpContext.Current.User.IsInRole("Support"))
    {
        ListBox1.DataSource = Roles.GetAllRoles().Except(
            new[] { "Super Admin", "Admin" });
    }
    fillDropDownCustomers();
}

Ответы [ 4 ]

4 голосов
/ 05 сентября 2011

Поместите эти значения в статический класс:

public static class MyRoles
{
    public const string Admin = "Admin";
    public const string SuperAdmin = "Super Admin";
    public const string Support = "Support";
}

Теперь вы можете использовать их так:

if (HttpContext.Current.User.IsInRole(MyRoles.SuperAdmin) ||
    HttpContext.Current.User.IsInRole(MyRoles.Admin) ||
    HttpContext.Current.User.IsInRole(MyRoles.Support))
{
2 голосов
/ 05 сентября 2011

Роли работают, присваивая значение тому, что может сделать пользователь. Роли не меняются, но поведение этих ролей меняется. Ультра-динамические решения, как правило, излишни.

Так что, возможно, у вас есть следующие роли

  • Супер Админ
  • Поддержка
  • Администратор

Вы можете выполнять различные действия (это будет зависеть от вашей системы)

  • Посмотреть
  • Редактировать
  • Утверждение

и т. Д.

  • Super Admin [Просмотр, редактирование, утверждение]
  • Поддержка [Просмотр]
  • Admin [Просмотр, редактирование]

Динамическая часть входит в назначение действий. Делая вещи таким образом, вам не важно, в какой роли кто-то играет, а какие действия они совершают. Действия являются динамическим аспектом в этих отношениях. Когда будет сделан запрос, вы будете использовать Роль пользователя, чтобы получить назначенные Действия для этой роли (База данных Управляется, чтобы сделать изменяемой)

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

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

  • UserRole [ID, UserName, RoleID] (Если пользователю назначено более одной роли, он наследует все действия, которые могут быть дублированы, и поэтому выбрал DISTINCT или предотвращает этот сценарий, но я считаю, что первый обеспечивает большую гибкость без сложности и ограничений ПРИМЕЧАНИЕ. Таблица UserRole может быть дополнительно денормализована, чтобы сделать уникальными имена пользователей.)
  • Роль [ID, имя]
  • Действие [ID, имя]
  • RoleAction [ID, RoleID, ActionID] (ограничение уникального ключа для RoleID и ActionID)

Когда сделан запрос, вы идентифицируете пользователя и т. Д. Имя пользователя , затем тренировки, в которых Роли (ей) , в которых они находятся запрашивая RoleAction и тем самым загружая связанные с ним действия

Я бы использовал перечисления для ваших значений действий и ролей. Это облегчает работу. Чтобы база данных и код находились в приемнике, убедитесь, что вы написали модульный тест, сопоставив значения базы данных со значениями перечисления.

0 голосов
/ 05 сентября 2011

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

Другой вариант - добавить имена ролей в файл конфигурации.Вы можете использовать настройки приложения или пользовательский класс конфигурации, который наследуется от ConfigurationSection.Посмотрите здесь, как http://msdn.microsoft.com/en-us/library/2tw134k3.aspx

Таким образом, вы можете изменить имена ролей в файле web.config, и вам не придется обновлять код или переиздавать проект.

0 голосов
/ 05 сентября 2011

Простой ответ - использование констант.Более контекстный ответ - использовать IoC, чтобы перенести логику в другой класс, где вы можете управлять конфигурацией отношений или базой данных.

...