2011-09-05 33 views
5

Khi Vai trò được tạo/xóa, tôi sẽ không muốn sửa đổi mã.Làm thế nào để làm việc với Vai trò (asp.net) mà không cần mã hóa chúng?

if (HttpContext.Current.User.IsInRole("Super Admin") || 
    HttpContext.Current.User.IsInRole("Admin") || 
    HttpContext.Current.User.IsInRole("Support")) 
{ 
    if (HttpContext.Current.User.IsInRole("Admin")) 
    { 
     ListBox1.DataSource = Roles.GetAllRoles().Except(
      new[] { "Super Admin" }); 

    } 
    if (HttpContext.Current.User.IsInRole("Support")) 
    { 
     ListBox1.DataSource = Roles.GetAllRoles().Except(
      new[] { "Super Admin", "Admin" }); 
    } 
    fillDropDownCustomers(); 
} 

Trả lời

2

Vai trò hoạt động bằng cách gán giá trị cho những gì người dùng có thể làm. Các vai trò không thay đổi nhưng hành vi cho những vai trò đó. Các giải pháp cực kỳ năng động có xu hướng quá mức cần thiết.

Vì vậy, có lẽ bạn có các vai trò sau

  • Super Admin
  • Hỗ trợ
  • quản

Bạn có thể có hành động khác nhau (Điều này sẽ phụ thuộc vào hệ thống của bạn)

  • Xem
  • Sửa
  • Phê duyệt

Etc

  • Super Admin [Xem, chỉnh sửa, Phê duyệt]
  • Hỗ trợ [Xem]
  • Admin [Xem, chỉnh sửa]

Phần năng động có trong việc gán các Hành động. Làm mọi thứ theo cách này bạn không quan tâm vai trò của ai đó trong đó nhưng họ có hành động gì. Hành động là khía cạnh năng động trong mối quan hệ này. Khi một yêu cầu được làm bạn sẽ sử dụng cho người sử dụng Vai trò để lấy Actions giao cho vai trò đó (Cơ sở dữ liệu Driven để làm cho sửa đổi)

Kết hợp này vào cấu trúc cơ sở dữ liệu của bạn là "Vai trò có nhiều Actions", có nghĩa là nếu mọi thứ thay đổi trong tương lai, bạn sẽ cần cập nhật mối quan hệ trong cơ sở dữ liệu chứ không phải mã.

Cấu trúc cơ sở dữ liệu có thể trông giống như thế này, tùy thuộc vào nhu cầu của bạn.

  • UserRole [ID, UserName, RoleID] (Nếu người dùng được gán nhiều hơn một vai trò kế thừa mọi hành động, có thể trùng lặp và do đó được chọn DISTINCT hoặc ngăn chặn tình huống này. CHÚ Ý: bảng UserRole có thể được chuẩn hóa thêm để làm cho UserNames trở nên độc đáo.)
  • Vai trò [ID, Name]
  • Action [ID, Name]
  • RoleAction [ID, Id vai trò, ActionID] (Unique chính Hạn chế về Id vai trò và ActionID)

Khi một yêu cầu được thực hiện , bạn xác định vv sử dụng UserName, Sau đó, tập luyện mà Vai trò (s) họ bằng quering các RoleAction và do đó nạp liên quan của họ Hoạt động

Tôi sẽ sử dụng enums cho hành động và vai trò giá trị của bạn. Điều này làm cho nó dễ dàng hơn để làm việc với. Để đảm bảo rằng Cơ sở dữ liệu và Mã đang ở trong trạng thái chìm, hãy đảm bảo rằng bạn viết một Bài kiểm tra Đơn vị điều chỉnh các giá trị cơ sở dữ liệu với các giá trị enum.

+0

Tôi nghĩ rằng nếu không sử dụng các hằng số như các câu trả lời khác đã đề xuất, thì điều này vẫn sẽ yêu cầu mã hóa cứng các vai trò trong mã. –

+0

Nó sẽ có, nhưng việc sử dụng các vai trò như được minh họa trong câu hỏi không được hiểu rõ và do đó mong muốn mở rộng vai trò thành một thứ gì đó năng động, khi thực sự là hành vi của họ năng động. – Jonathan

+1

Cảm ơn rất nhiều vì câu trả lời này. Nó thực sự hữu ích vì tôi đã cho phép/vô hiệu hóa người dùng trong mọi phần duy nhất mà tôi cần thực hiện một hành động thay vì yêu cầu cơ sở dữ liệu nếu họ có thể hay không. Tuy nhiên, tôi vẫn tự hỏi điều gì sẽ xảy ra nếu một người dùng cụ thể có thể tạo ra một số bản ghi nhưng không phải tất cả chúng: tạo ra một hành động gọi là "tạo" sẽ không phải là giải pháp hiệu quả nhất phải không? Tôi có phải tạo mối quan hệ giữa các hành động bảng và phần còn lại của bảng không? Cảm ơn sự giúp đỡ của bạn! – aleafonso

4

Đặt những giá trị đó trong lớp tĩnh:

public static class MyRoles 
{ 
    public const string Admin = "Admin"; 
    public const string SuperAdmin = "Super Admin"; 
    public const string Support = "Support"; 
} 

Bây giờ bạn có thể tái sử dụng chúng như thế này:

if (HttpContext.Current.User.IsInRole(MyRoles.SuperAdmin) || 
    HttpContext.Current.User.IsInRole(MyRoles.Admin) || 
    HttpContext.Current.User.IsInRole(MyRoles.Support)) 
{ 
0

câu trả lời đơn giản là hằng số sử dụng. Câu trả lời ngữ cảnh hơn là sử dụng IoC để đẩy logic vào một lớp khác, nơi bạn có thể quản lý cấu hình hoặc cấu hình biểu mẫu quan hệ.

0

Hoặc là các câu trả lời khác đã đề xuất, dưới dạng Biến cố định. Tuy nhiên, bạn vẫn cần phải thay đổi mã và tái xuất bản nếu bạn thay đổi tên của một trong các vai trò.

Một tùy chọn khác là thêm tên của vai trò vào tệp cấu hình. Bạn sẽ sử dụng Cài đặt ứng dụng hoặc lớp cấu hình tùy chỉnh kế thừa từ ConfigurationSection. Hãy xem tại đây để biết cách http://msdn.microsoft.com/en-us/library/2tw134k3.aspx

Bằng cách này bạn có thể thay đổi tên của vai trò trong tệp web.config và bạn sẽ không phải cập nhật bất kỳ mã nào hoặc tái xuất bản dự án.

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