Estoy tratando de implementar un nuevo enfoque de acceso basado en permisos para mi aplicación MVC; Tenemos varios Grupo de permisos y cada grupo contiene una lista de Permiso. por ejemplo, tenemos el grupo de permisos Invoices
que contiene las claves de permiso CreateInvoice,RemoveInvoice,etc
.Atributos de C#: Usar constantes enum como parámetros de entrada
En este enfoque cada mvc Action
debe requerir un permiso específico para la ejecución. Estoy tratando de hacerlo a través de CustomAttributes, algo como esto:
public class InvoiceController : Controller
{
[RequirePermission(Permissions.Invoices.CreateInvoice)]
public ActionResult Create()
{
return View();
}
}
Para que sea más fácil para los desarrolladores para recordar los diferentes grupos de permisos y claves de permiso que estoy tratando de crear una lista predefinida de permisos que debe ser una combinación de grupo de permisos y clave de permiso. pero debido a las restricciones aplicadas al uso de argumentos de atributos en C# no pude hacerlo funcionar todavía. (no quiero hacer una gran enumurator extra y poner todas las llaves de permisos allí)
mi último intento fue la creación de un enumerador para cada grupo de permisos y luego definir claves de permisos que las constantes de enumeración allí:
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
}
}
Como puede ver aquí tenemos una combinación de códigos, la clave de grupo de permisos especificada utilizando un PermissionGroup
atributo y el código de la clave de permiso especificado como código numérico en cada constante enum.
atributo la RequirePermission define como a continuación:
public class RequirePermissionAttribute : Attribute
{
private Enum _Permission;
public RequirePermissionAttribute(Enum Permission)
: base()
{
_Permission = Permission;
}
}
pero el problema es que los objetos de tipo Enum
no podían utilizarse como argumentos Atributo.
Cualquier sugerencia/idea se aprecia
sí, lo he hecho, pero mi problema no es la creación de un atributo (atributo ActionFilter) para comprobar Permisos de usuario. Solo necesito una forma mejor (que usar claves simples de cadena) para crear constantes de permisos predefinidas. – sos00
http: //www.vivienchevallier.com/Articles/create-a-custom-authorizeattribute-that-accepts-parameters-of-type-enum Pruebe esto. – AdrianCogiel