2012-09-17 36 views
5

Tôi đang cố gắng triển khai phương pháp tiếp cận quyền truy cập dựa trên quyền mới cho ứng dụng MVC của mình; Chúng tôi có một số Nhóm quyền và mỗi nhóm có một danh sách Giấy phép. ví dụ chúng tôi có nhóm giấy phép Invoices có chứa các phím cho phép CreateInvoice,RemoveInvoice,etc.Thuộc tính C#: Sử dụng hằng số enum làm tham số đầu vào

Trong phương pháp này, mỗi mvc Action phải yêu cầu giấy phép cụ thể để thực thi. Tôi đang cố gắng để làm điều này thông qua CustomAttributes, một cái gì đó như thế này:

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

Để làm cho nó dễ dàng hơn cho các nhà phát triển để nhớ Cho phép nhóm khác nhau và Keys Permission Tôi đang cố gắng để tạo ra một danh sách được xác định trước các điều khoản mà nên là sự kết hợp giữa nhóm quyền và khóa cấp phép. nhưng do các hạn chế được áp dụng cho việc sử dụng các đối số thuộc tính trong C# Tôi chưa thể thực hiện nó. (Tôi không muốn thực hiện thêm một enumurator lớn và đặt tất cả các phím phép trong đó)

thử cuối cùng của tôi đã tạo ra một Enumerator cho mỗi nhóm cho phép và sau đó xác định các phím phép như hằng enum trong đó:

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

Như bạn có thể thấy chúng tôi kết hợp mã ở đây, khóa nhóm quyền được chỉ định sử dụng mã thuộc tính PermissionGroup và mã khóa cho phép được chỉ định dưới dạng mã số trên mỗi hằng số enum.

các RequirePermission thuộc tính được định nghĩa như sau:

public class RequirePermissionAttribute : Attribute 
{ 
    private Enum _Permission; 

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

nhưng vấn đề là đối tượng thuộc loại Enum không thể được sử dụng như Arguments Thuộc tính.

Bất kỳ đề xuất/ý tưởng nào được đánh giá cao

Trả lời

6

Tôi đã tìm thấy giải pháp, điều duy nhất cần phải thay đổi là loại thông số xây dựng. thay vì sử dụng Enum bạn phải sử dụng object:

public class RequirePermissionAttribute : AuthorizeAttribute 
{ 
    private object _Permission; 

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

Đây là mã hoàn chỉnh:

/***************** 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

Tôi không nghĩ rằng có thể tôi đã cố gắng làm việc của bạn và không thành công:/xin lỗi.

Quyền về hành động nên được sử dụng với Authorize và bạn có thể làm ovveride của riêng bạn viết một cái gì đó như thế này:

[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); 

    } 

} 

sau đó vào hành động của bạn:

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

tuy nhiên nó vẫn còn là một chuỗi mà bạn sử dụng và để nó hoạt động, bạn cần phải kết hợp nó với nhà cung cấp vai trò tùy chỉnh. Nhiều hussle nhưng giá trị nó theo ý kiến ​​của tôi.

+0

vâng, tôi đã làm điều đó nhưng vấn đề của tôi không tạo ra một thuộc tính (ActionFilter thuộc tính) để kiểm tra Quyền Người dùng. Tôi chỉ cần một cách tốt hơn (hơn bằng cách sử dụng các phím chuỗi đồng bằng) để tạo các hằng số quyền được xác định trước. – sos00

+1

http: //www.vivienchevallier.com/Articles/create-a-custom-authorizeattribute-that-accept-parameters-of-type-enum Hãy thử điều này. – AdrianCogiel

Các vấn đề liên quan