Asp.net 4 MVC3 слабосвязанные роли и действия - PullRequest
1 голос
/ 13 января 2012

для проекта, я делаю mvc3 asp.net приложение. Одной из функций, которую я хотел бы реализовать, является слабосвязанная атрибуция Role - Action. По сути, администратор должен уметь создавать роли и связывать их с действиями.

Сами роли хранятся в базе данных.

Мне интересно, сработает ли что-то из следующего подхода:

//Definition of a the Attribute

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class MyFlexibleAttribute : AuthorizeAttribute
{
    private Repository RolesRepository = new Repository();
    public  String ActionName {get; set;}   

    public MyFlexibleAttribute()
    {
        Roles = RolesRepository.getStringRolesSeparatedByComma(ActionName)
    }
 }


// where in a random controller of a view, I could state

[MyFlexibleAttribute(ActionName = "SpecialAction"]
public ActionResult SpecialAction()
{
    return View();
}

Каково ваше мнение?

Спасибо

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

например. база данных обновлена, новое действие для новой роли, но хранилище не обновлено ...

Так как это выглядит в этом контексте:

       public ActionTypeName  ActionTypeName {get; set;}
       private Repository repo;
       public CustomAuthorizeAction(ActionTypeName actionTypeName)
       {
         this.ActionTypeName = actionTypeName;
        }

     public override void OnAuthorization(AuthorizationContext filterContext)
    {
        //instantiate new instance when calling the OnAuthorization method
        this.repo = new Repository();
        List<Role> tmp = repo.getRolesLinkedToAction(this.ActionTypeName).ToList();
        Roles = String.Join(",", tmp.Select(r => r.Name));
        base.OnAuthorization(filterContext);
     }

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

1 Ответ

0 голосов
/ 13 января 2012

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

...