Я пытаюсь внедрить новый подход к доступу на основе разрешений для моего приложения MVC; У нас есть несколько групп разрешений, и каждая группа содержит список разрешений. например, у нас есть группа разрешений Invoices
, которая содержит ключи разрешений CreateInvoice,RemoveInvoice,etc
.
В этом подходе каждый mvc Action
должен требовать определенного разрешения для выполнения. Я пытаюсь сделать это через CustomAttributes, что-то вроде этого:
public class InvoiceController : Controller
{
[RequirePermission(Permissions.Invoices.CreateInvoice)]
public ActionResult Create()
{
return View();
}
}
Чтобы облегчить разработчикам запоминание различных групп разрешений и ключей разрешений, я пытаюсь создать предварительно определенный список разрешений, который должен представлять собой комбинацию группы разрешений и ключа разрешений. но из-за ограничений, применяемых к использованию аргументов атрибутов в С#, я пока не мог заставить его работать. (Я не хочу делать слишком большой счетчик и помещать туда все ключи разрешений)
моей последней попыткой было создать перечислитель для каждой группы разрешений, а затем определить ключи разрешений как константы перечисления:
public class PermissionEnums
{
[PermissionGroup(PermissionGroupCode.Invoice)]
public enum Invoices
{
CreateInvoice = 1,
UpdateInvoice = 2,
RemoveInvoice = 3,
ManageAttachments = 4
}
[PermissionGroup(PermissionGroupCode.UserAccounts)]
public enum UserAccounts
{
Create = 1,
ChangePassword = 2
}
}
Как видите, здесь у нас есть комбинация кодов: ключ группы разрешений, указанный с помощью атрибута PermissionGroup
, и код ключа разрешений, указанный в виде числового кода для каждой константы перечисления.
атрибут RequirePermission, определенный ниже:
public class RequirePermissionAttribute : Attribute
{
private Enum _Permission;
public RequirePermissionAttribute(Enum Permission)
: base()
{
_Permission = Permission;
}
}
но проблема в том, что объекты типа Enum
нельзя было использовать в качестве аргументов атрибутов.
Любое предложение/идея приветствуется