2012-11-03 40 views
7

Giống như tất cả các ứng dụng Line-Of-Business, một ứng dụng có thể có nhiều Users với một số Roles được gán cho chúng. Gần đây chúng tôi đã chuyển sang Kiến trúc MVVM của WPF và tìm cách tốt nhất để gán vai trò cho mỗi người dùng đã đăng nhập. Có nhiều thuật ngữ nổi trên internet như Authentication, RoleManager, LoginService vv, nhưng tôi không chắc chắn nên làm việc với.Gán Vai trò cho Người dùng Ứng dụng

Đây là những gì chúng ta có:

Một ứng dụng doanh nghiệp nhỏ (Với 20 hình thức), được phát triển trong một dự án duy nhất. Chúng tôi sử dụng kiến ​​trúc MVVM, LINQ-to-SQL dưới dạng DataAccess và Model, với Repository patternUnit Of Work.

gì chúng ta muốn:

Có nhiều hình thức khác nhau và mỗi hình thức có chèn, cập nhật, xóa, in vv hoạt động. Điều chúng tôi muốn là hạn chế người dùng đã đăng nhập theo vai trò của anh ấy - với nhiệm vụ anh ấy có thể thực hiện. ví dụ: ví dụ Quản trị viên được tự do làm "mọi thứ" với ứng dụng, trong khi một số người dùng khác có thể không được phép xem một số biểu mẫu hoặc thực hiện một số thao tác (cập nhật hoặc xóa).

Vậy làm cách nào chúng ta có thể đạt được điều này; loại dịch vụ nào có thể được sử dụng để thực hiện cơ chế hoàn chỉnh này bằng cách sử dụng kiến ​​trúc MVVM trong một ứng dụng Desktop LOB. Một thuật ngữ kỹ thuật hoặc liên kết hướng dẫn sẽ hữu ích.

Tôi hy vọng tôi rõ ràng và cảm ơn bạn rất nhiều trước.

Chỉnh sửa: Tôi đã đi qua nhiều diễn đàn và bài viết xung quanh, nhưng tất cả đều tập trung vào ASP.NET. Vẫn không thể tìm thấy một triển khai cụ thể để gán vai trò trong WPF. Và các nguồn trên ASP.NET không tuân thủ tốt với WPF.

+0

MVVM gì khuôn khổ bạn đã sử dụng hoặc bạn đã cuộn của riêng bạn? –

+1

Chúng tôi có cùng một vấn đề. Hầu hết các quyền đều được mã hóa cứng. Chúng tôi đã lên kế hoạch thực hiện ACL chính thức. Đồng nghiệp của tôi cung cấp Dịch vụ Vai trò WCF (http://msdn.microsoft.com/en-us/library/bb386424(v=vs.100).aspx) làm cơ sở hạ tầng sẵn sàng. Nhưng chúng tôi vẫn không chắc chắn về cách tốt nhất để áp dụng quyền trong mô hình xem vì chúng tôi muốn tránh mã hóa cứng càng nhiều càng tốt. Chúng tôi cũng quyết định xem Prism. Chúng tôi nghi ngờ nó có chứa các chức năng cần thiết. –

+0

Nhân tiện, bạn đã bao giờ xem xét sử dụng AOP cho tác vụ này chưa? http://izlooite.blogspot.ru/2010/06/aspect-oriented-programming.html http://stackoverflow.com/questions/325558/aspect-oriented-programming-examples http: //www.sharpcrafters .com/ Tuyên bố từ chối trách nhiệm: Tôi mới làm quen với phương pháp này và hầu như không biết gì về nó. Nhưng Code Contacts cũng giống nhau nên tôi nghĩ nó có thể giúp ích. –

Trả lời

4

tôi muốn đề nghị xây dựng một giải pháp xung quanh ASP.NET Membership & Role Management nhà cung cấp (mặc dù chỉnh sửa cho câu hỏi ban đầu của bạn). Chúng được ghi lại trên MSDN & rất linh hoạt.

Dưới đây là một số liên kết mà hy vọng sẽ giúp bạn với việc tích hợp WPF:

Ngoài ra, bạn nói rằng bạn đang sử dụng MVVM; Tôi muốn đề nghị có một lớp tĩnh, hoặc tài sản có thể truy cập toàn cầu khác (xem: WPF Application using a global variable) của một thể hiện của một lớp ủy quyền tập trung. Các phương thức của lớp này sau đó có thể được gọi từ bất kỳ đâu trong ứng dụng (tức là trong ViewModels) để bật/tắt hoặc hiển thị/ẩn các tính năng thích hợp, dựa trên bất kỳ quyền nào được cấp cho người dùng.

0

Điều tôi sẽ làm là tạo một lớp tĩnh trong lớp máy khách chứa thông tin của người dùng hiện tại (vai trò, quyền, v.v.). Các quyền này có thể được mô hình hóa ví dụ bằng enum hoặc một cái gì đó tương tự, sau đó trong mỗi ViewModel, bạn có thể xác định giá trị enum nào được yêu cầu để thực hiện truy vấn (xem bản ghi) hoặc thực hiện lệnh Lưu hoặc Chỉnh sửa.

0

Tôi chỉ cần đặt thuộc tính RequiredRole trong mỗi lệnh và thêm ghi đè lên CanExecute để kiểm tra người dùng hiện tại có quyền làm điều đó không. Điều này là đủ cho các lệnh.

Mặt khác, quyền hiển thị một hình thức phải được kiểm tra trong màn hình chủ chỉ huy/tab của bạn/...

Fetch vai trò và mỗi vai trò người khởi kiện với LINQ to SQL, và nó kết thúc. Tôi sẽ không bận tâm với việc tích hợp mã bên ngoài cho một nhiệm vụ đơn giản như vậy.

Nếu bạn muốn làm cho nó chung chung hơn, hãy giữ cho DB của bạn một bảng liên kết các lệnh/biểu mẫu và vai trò, và sử dụng sự phản chiếu để ủy quyền cho người dùng.

Tôi hy vọng bạn sẽ thấy hữu ích

0

Chúng tôi đang sử dụng AD để xác định vai trò của người dùng. Sau đó kiểm tra xem có bất kỳ vai trò nào có quyền phù hợp hay không.Tuy nhiên, bạn có thể sử dụng bảng rolesuserroles để tự mình thực hiện phần này.

Sử dụng một trong hai cách tiếp cận này mà người dùng sẽ có trong một nhóm vai trò. Đó là bước đầu tiên.

Sau đó, bạn cần phải xác minh tại thời điểm hành động mà người dùng có quyền. Cấu trúc trình đơn của chúng tôi được tạo động từ cơ sở dữ liệu, vì vậy tôi có một bảng là MenuItems và sau đó là bảng xác định RoleMenuAvailability.

Đầu tiên có Id, một order, Title, Image sourcenavigation target, cùng với một vài trường khác.

Loại thứ hai có RoleIdmenuId và có thể chỉnh sửa hay không. Vì vậy, sự hiện diện của hàng có nghĩa là nó có thể đọc được (nếu một hình thức chuyển hướng mục tiêu tức) Các mục trình đơn này sau đó được đọc từ cơ sở dữ liệu:

var usersItems = 
    items.Where(i => i.RoleMenuAvailabilities 
        .Any(r => domainUser.IsInDomainRole(r.UserRole.Description))) 
     .OrderBy(m => m.MenuOrder); 

UserRole.Description trong trường hợp của chúng tôi là tên của vai trò AD và IsInDomainRole là một hàm helper:

public bool IsInDomainRole(string role) 
{ 
    var regex = new Regex("[^\\\\]+$"); 
    string name = this.Name ?? string.Empty; 
    string domainRole = regex.Replace(name, role); 
    return this.IsInRole(domainRole); 
} 

bảng rolemenuavailability có thể được mở rộng để có cờ thêm vào nó cho xóa, cập nhật, bổ sung, vv nếu bạn yêu cầu.

Chúng tôi chưa triển khai đầy đủ các giai đoạn tiếp theo, nhưng ý định là chúng tôi sẽ có quyền người dùng được lưu vào bộ nhớ cache đối với người dùng. Lớp cơ sở ViewModel của chúng tôi có tham chiếu đến người dùng và do đó có thể gọi hàm CanEdit(int permissionId). Sau đó, các thuộc tính cơ bản kiểm soát khả năng hiển thị hoặc các lệnh CanExecute do đó có thể truy cập các quyền của người dùng và tìm hiểu xem chúng có quyền cho bất kỳ hành động nào không.

Vẫn còn một công việc đang được tiến hành nên sẽ quan tâm để xem những đề xuất khác sẽ xuất hiện ở đây.

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