Совместная инициализация атрибута ролей между атрибутом и методами - PullRequest
4 голосов
/ 15 сентября 2011

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

    [CheckRoles(SystemRole.ID.Admin, SystemRole.ID.User)]
    public class MyController : Controller
    {
            ....
    }

Однако в других частях кода я хотел бы проверить, входит ли пользователь в какую-либо из этих ролей,так что я могу перейти на правильную страницу.Код выглядит примерно так:

if (roles.IsInAnyRoles(user, SystemRole.ID.Admin, SystemRole.ID.User)
{
    ... Do something in MyController ...
}

Вы можете увидеть повторение здесь.Я действительно хочу иметь две роли в списке переменных или инициализатора или что-то такое, что я могу передать как атрибуту, так и методу.Создание массива const не работает.Есть ли способ сделать это?Могу ли я как-нибудь сохранить инициализатор массива?

Любая помощь будет принята с благодарностью!

ОБНОВЛЕНИЕ

Я сделал перечисление ролей в перечислении Flags (и дал соответствующие пунктыценности).Это означает, что я могу или значения вместе, чтобы дать одно, постоянное значение.Теперь я могу использовать это постоянное значение в Атрибуте и в методах.Спасибо Дэнни Чену ниже.

1 Ответ

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

В моем реальном опыте проекта я хотел бы определить роли следующим образом;

[Flags]
public enum Role
{
   Staff = 0,
   Supervisor = 1,
   Manager = 2,
   Admin = 4,
   HelpDesk = 8 
}

Причина в том, что с одной учетной записью часто связано несколько ролей, например, кто-то является руководителем Боба, а также он является руководителем ИТ-отдела. В этом случае его роль составляет Role.Supervisor | Role.Manager, чтобы он мог использовать все функции, предоставляемые Role.Supervisor (например, утверждение запроса на отпуск Боба), а он может утверждать запросы на отпуск от всех сотрудников ИТ-отдела. Действие выглядит так:

[CheckRole(Role.Supervisor, Role.Manager)]
public ActionResult ApproveLeavingRequest()
{
    //the roles in the constructor of CheckRoleAttribute are OR related
}

[CheckRole(Role.Manager|Role.Supervisor, Role.Admin)]
public ActionRequest ModifySystemSettings()
{
    //this method is provided to a small group of people
    //those who is a manager and a supervisor
    //or he is an admin
}

[CheckRole(Role.Manager|Role.Supervisor|Role.Admin)] 
           //maybe we need to add Role.Boss into the system :)
public ActionRequest IncreasePay()
{
    //only the boss account can invoke this method
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...