2013-06-18 89 views
11

Tiêu đề của câu hỏi tiếp tục khá nhiều: nơi nào tôi xác minh ủy quyền cho một Lệnh?Nơi để xác minh ủy quyền cho một Lệnh?

Ví dụ, đặt khách hàng là ưu tiên bao gồm:

  • MarkAsPreferred điều khiển hành động (có thể là Winforms hoặc bất kỳ);
  • SetCustomerAsPreferredCommand;
  • SetCustomerAsPreferredCommandHandler;
  • Customer.MarkAsPreferred() (tên miền);

tôi đã xác định 3 địa điểm để kiểm tra ủy quyền:

  • UI để hiển thị các mục đích (người dùng không nên thấy một liên kết/nút nếu anh/cô ấy không có quyền truy cập vào nó);
  • hành động điều khiển để xác minh người dùng được phép gọi lệnh đó; lệnh được giả định luôn thành công (liên quan đến xác nhận hợp lệ, nhưng tôi cũng giả định ủy quyền) và chúng tôi có cơ hội thông báo cho người dùng về việc thiếu quyền truy cập;
  • bên trong lệnh ngay trước khi gọi tên miền logic;

SomeView.cshtml

if (authorizationService.Authorize("MarkCustomerAsPreferred)) 
{ 
    // show link 
} 

CustomerController

[HttpPost] 
public ActionResult MarkAsPreferred(Guid id) 
{ 
    if (!authorizationService.Authorize("MarkCustomerAsPreferred)) 
    { 
     return RedirectToAction("Unauthorized"); 
    } 

    var MarkCustomerAsPreferredCommand { Id = id }; 
    ... 
} 

MarkCustomerAsPreferredCommandHandler

public void Handle(MarkCustomerAsPreferredCommand command) 
{ 
    if (!authorizationService.Authorize("MarkCustomerAsPreferred")) 
    { 
     throw new Exception("..."); 
    } 

    customer.MarkAsPreferred(); 
} 

Câu hỏi của tôi là: Tôi có cần để xác minh ủy quyền ở 3 địa điểm hoặc tôi chỉ đang quá hăng hái?

Tôi đã tìm kiếm tất cả qua internet nhưng không thể tìm thấy bất kỳ ví dụ hoặc tham chiếu nào về điều này.

Sửa

Sau nhiều nghiên cứu và một số xét nghiệm Tôi nghĩ rằng gói các lệnh để thêm hành vi (ủy quyền, xác nhận, khai thác gỗ) như Dennis Taub đề xuất là dễ dàng hơn và sạch hơn để thực hiện.

Tôi tìm thấy this blog post giải thích chính xác khái niệm này.

Về việc có nhiều bộ xử lý cho một lệnh, tôi không cần phải thực hiện một xử lý lệnh cho mỗi hành vi cho mỗi lệnh ban đầu, một trong những gói lệnh có thể bọc tất cả các bộ xử lý.

Trả lời

5

Tôi cho rằng việc cấp phép cuối cùng nên được thực hiện ở cấp dịch vụ ứng dụng, tức là một phần của việc xử lý lệnh. Bạn có thể bọc trình xử lý lệnh bằng trình xử lý ủy quyền chẳng hạn.

class AuthorizationHandler : IHandle<SetCustomerAsPreferred> { 

    IHandle<SetCustomerAsPreferred> innerHandler; 

    public AuthorizationHandler(IHandle<SetCustomerAsPreferred> handler) 
    { 
     innerHandler = handler; 
    } 

    public void Handle(SetCustomerAsPreferred command) 
    { 
     if (/* not authorized */) 
      throw ... 
     innerHandler.Handle(command); 
    } 

} 

class SetCustomerAsPreferredCommandHandler : IHandle<SetCustomerAsPreferred> { 

    public void Handle(SetCustomerAsPreferred command) 
    { 
     // do the work 
    } 

} 
+0

Gói lệnh là một cách hay để thêm chức năng, nhưng nó đặt ra một vài câu hỏi: 1) Điều này mở ra nhiều khả năng, ví dụ như ghi nhật ký và xác thực; vì vậy cho mỗi lệnh tôi sẽ thực hiện N xử lý lệnh (xử lý thực tế, đăng nhập, xác nhận, ủy quyền, vv)? 2) Bây giờ tôi có hai hoặc nhiều xử lý cho cùng một lệnh, làm thế nào để container IoC của tôi sẽ thiết lập chúng một cách chính xác để tiêm vào bộ điều khiển? 3) Tôi có nên vẫn kiểm tra sự cho phép trong bộ điều khiển trước khi xử lý lệnh, để giảm thiểu rủi ro của chúng không được chấp nhận? –

+1

Cách tiếp cận này có một chút mùi từ quan điểm của tôi, vì bạn đã định nghĩa 2 trình xử lý cho cùng một lệnh. Tôi nghĩ rằng kiểm tra auth nên được thực hiện tại thời điểm khi lệnh được ban hành. ít nhất với asp.net MVC tôi muốn có một bộ lọc ủy quyền (mà có lẽ sẽ làm việc với api web là tốt). Đó là một vấn đề ưu tiên ở đây. @LuizDamim Ít nhất ServiceBus của tôi (mà gần đây tôi đã viết) có tùy chọn bỏ qua một số loại khi thực hiện cấu hình tự động và có lẽ cả dịch vụ xe buýt bạn đang sử dụng cũng có tùy chọn này. – MikeSW

+0

@LuizDamim 1) Việc ghi nhật ký không nên được thực hiện như một trình xử lý lệnh, có nghĩa là bất kỳ trình xử lý tin nhắn nào cũng có thể phụ thuộc vào trình ghi nhật ký. Xác nhận được thực hiện trong 2 palces với các mục đích khác nhau: bạn đã xác nhận đầu vào được thực hiện ở cấp điều khiển và xác nhận quy tắc nghiệp vụ được thực hiện bởi chính đối tượng miền. 3) Với asp.net mvc tôi muốn nói rằng người dùng không nên đạt được hành động đó nếu anh ta không có quyền phát hành lệnh đó. – MikeSW

4

Đó là giao diện người dùng tốt để có mà xác minh trong View, vì vậy người dùng sẽ không nhấp vào nó do nhầm lẫn. Tôi coi việc xác minh điều khiển 'thực tế' một, bởi vì đó là nơi các lệnh được tạo ra.Nếu người dùng không có quyền, cô ấy sẽ không thể tạo (hoặc thậm chí đạt được hành động đó) lệnh.

Tôi nghĩ rằng việc kiểm tra trong trình xử lý là hơi quá mức, vì nó không phải là trách nhiệm của mình để làm ủy quyền và không giống như trình xử lý đó có thể được tiếp cận trực tiếp bởi người dùng.

+1

Sẽ rất đáng để kiểm tra ủy quyền trong trình xử lý lệnh để cho phép sử dụng lại miền với dịch vụ khác. Ví dụ, cung cấp một API sử dụng ASP.NET Web API. Bạn có thể tạo một trình xử lý lệnh được gọi ra trước mỗi trình xử lý lệnh để 'tự động hóa' gọi dịch vụ ủy quyền bằng lệnh như hoạt động để xác minh. –

+0

Tôi đã đặt khá nhiều quyền kiểm tra trên giao diện người dùng và bộ điều khiển, nhưng như Dennis đã đề xuất, một lệnh gói thực hiện điều này trước khi xử lý thực tế (và nếu nó dễ thực hiện như vậy), hãy cung cấp thêm một lớp xác minh _for free_. Sử dụng lại các lệnh như @Ben Smith nói là một lợi ích khác mà tôi đã không nghĩ tới. –

+0

@BenSmith Trên thực tế nó không phải là một ý tưởng tồi cho một dịch vụ xe buýt để hỗ trợ trước và sau xử lý lệnh hành động, tương tự như asp.net bộ lọc mvc. – MikeSW