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


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

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 5

4 ответа:

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

Поэтому, возможно, у вас есть следующие роли

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

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

  • Вид
  • править
  • утвердить

Etc

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

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

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

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

  • UserRole [ID, UserName, RoleID] (если пользователю назначено более одной роли, они наследуют все действия, которые могут дублироваться и поэтому выбираются различными или предотвращают этот сценарий, но я считаю, что первый обеспечивает большую гибкость без сложности и ограничение. Примечание: UserRole таблице может быть дальше ненормированные сделать имена пользователей уникальны.)
  • роль [ID, имя]
  • действие [ID, имя]
  • RoleAction [ID, RoleID, ActionID] (уникальное ключевое ограничение на RoleID и ActionID)

Когда запрос сделан, вы идентифицируете пользователя и т. д имя пользователя, затем тренировка, которая роль(Ы) они находятся в путем quering RoleAction и таким образом нагружают их связанное действия

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

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

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))
{

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

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

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

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