для проекта, я делаю 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);
}
надеюсь, это поможет