Как работать с ролями (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 ответа:
Роли работают, присваивая значение тому, что может сделать пользователь. Роли не меняются, но поведение для этих ролей меняется. Сверхдинамические решения, как правило, излишни.
Поэтому, возможно, у вас есть следующие роли
- Супер Админ
- Поддержка
- админ
Вы можете выполнять различные действия (это будет зависеть от вашей системы)
- Вид
- править
- утвердить
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Таким образом, вы можете изменить имена ролей в сети.конфигурационный файл, и вам не придется обновлять какой-либо код или переиздавать проект.