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ý.
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? –
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
@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