2012-09-17 10 views
5

parametreleri olarak enum sabitlerini kullanarak; Birkaç İzin Grubumuz var ve her grup İzin Izin bir listesini içerir. örneğin, CreateInvoice,RemoveInvoice,etc izin anahtarlarını içeren Invoices izin grubuna sahibiz.C# Özellikleri: girdi benim MVC uygulama için yeni izin tabanlı erişim yaklaşımını uygulamak çalışıyorum

Bu yaklaşımda, her mvc Action, yürütme için belirli bir izin gerektirir. Ben, CustomAttributes aracılığıyla böyle bir şey yapmak çalışıyorum:

public class InvoiceController : Controller 
    { 
     [RequirePermission(Permissions.Invoices.CreateInvoice)] 
     public ActionResult Create() 
     { 
      return View(); 
     } 
    } 

daha kolay geliştiriciler Ben izinlerin önceden tanımlı bir liste oluşturmak çalışıyorum farklı Join Groups ve İzin Keys hatırlamak için yapmak o should izin grubu ve izin anahtarı bir arada olun. Ancak, C# numaralı öznitelikler argümanlarını kullanmaya yönelik uygulanan kısıtlamalar nedeniyle henüz çalışamamıştım.

benim son deneyin her izin grubu için bir sýralayýcý yaratan ve sonra orada enum sabitleri olarak izin anahtarlarına define (Ben ekstra büyük enumurator yapmak ve orada tüm izin anahtarlarını koymak istemiyorum):

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 
    } 
} 

Gördüğünüz gibi burada bir kod kombinasyonumuz var, her bir enum sabiti üzerinde sayısal kod olarak belirtilen PermissionGroup özniteliği ve izin anahtarı kodu kullanılarak belirtilen izin grubu anahtarı. aşağıdaki gibi tanımlanmıştır

RequirePermission özelliği:

public class RequirePermissionAttribute : Attribute 
{ 
    private Enum _Permission; 

    public RequirePermissionAttribute(Enum Permission) 
     : base() 
    { 
     _Permission = Permission; 
    } 
} 

ancak sorun türünü Enum nesneleri Özellik Argümanlar olarak kullanılamamıştır olmasıdır./Üzgün:

Herhangi bir öneri/fikir,

cevap

6

Çözümü buldum, değiştirilmesi gereken tek şey yapı tipi parametresidir. yerine Enum kullanmanın size object kullanmak zorunda: Burada

public class RequirePermissionAttribute : AuthorizeAttribute 
{ 
    private object _Permission; 

    public RequirePermissionAttribute(object Permission) 
     : base() 
    { 
     _Permission = Permission; 
    } 
} 

tam kodudur:

/***************** Permission Groups And Keys *****************/ 
public static class Permissions 
{ 
    [PermissionGroup(PermissionGroupCode.Invoice)] 
    public enum Invoices 
    { 
     CreateInvoice = 1, 
     UpdateInvoice = 2, 
     RemoveInvoice = 3, 
     ManageAttachments = 4 
    } 

    [PermissionGroup(PermissionGroupCode.UserAccounts)] 
    public enum UserAccounts 
    { 
     Create = 1, 
     ChangePassword = 2 
    } 
} 

public enum PermissionGroupCode 
{ 
    Invoice = 1, 
    UserAccounts = 2, 
    Members = 3 
} 

/***************** Attributes & ActionFilters *****************/ 

[AttributeUsage(AttributeTargets.Enum)] 
public class PermissionGroupAttribute : Attribute 
{ 
    private PermissionGroupCode _GroupCode; 
    public PermissionGroupCode GroupCode 
    { 
     get 
     { 
      return _GroupCode; 
     } 
    } 

    public PermissionGroupAttribute(PermissionGroupCode GroupCode) 
    { 
     _GroupCode = GroupCode; 
    } 
} 


public class RequirePermissionAttribute : AuthorizeAttribute 
{ 
    private object _RequiredPermission; 

    public RequirePermissionAttribute(object RequiredPermission) 
     : base() 
    { 
     _RequiredPermission = RequiredPermission; 
    } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     var permissionGroupMetadata = (PermissionGroupAttribute)_RequiredPermission.GetType().GetCustomAttributes(typeof(PermissionGroupAttribute), false)[0]; 

     var groupCode = permissionGroupMetadata.GroupCode; 
     var permissionCode = Convert.ToInt32(_RequiredPermission); 

     return HasPermission(currentUserId, groupCode, permissionCode); 
    } 
} 
0

ben senin olanı yapmaya çalıştım ve başarısız mümkün şu sanmıyorum takdir edilmektedir. eylemler

İzinler

yetkilendirme ile kullanılmalı ve bu gibi kendi ovveride yazma şeyler yapabilir: En eylemi ardından

[AttributeUsage(AttributeTargets.All)] 
    public sealed class CustomAuthorizeAttribute : AuthorizeAttribute 
    { 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     if (httpContext == null) 
      throw new ArgumentNullException("httpContext"); 

     //Its a piece of code from my app you can modify it to suit your needs or use the base one 
     if (!new CustomIdentity(httpContext.User.Identity.Name).IsAuthenticated) 
     { 
      return false; 
     } 

     return true; 
    } 

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     base.HandleUnauthorizedRequest(filterContext); 

    } 

} 

:

[CustomAuthorizeAttribute(Roles = "FE")] 
public ActionResult Index() 
{ 
    return RedirectToAction("Index", "Documents"); 
} 

ancak onun hala bir dize olduğunu kullanmak ve kullanmak için özel rol sağlayıcı ile birleştirmek gerekir. Çok hussle ama bence buna değer.

+0

evet, bunu yaptık ama benim problem kontrol etmek için bir Özellik (ActionFilter özelliğini) oluşturarak değil Kullanıcı İzinleri. Önceden tanımlanmış izin sabitleri oluşturmak için daha iyi bir yönteme ihtiyacım var. – sos00

+1

http: //www.vivienchevallier.com/Articles/create-a-custom-authorizeattribute-that-accepts-parameters-of-type-enum Bunu deneyin. – AdrianCogiel

İlgili konular