Trường hợp nào áp dụng quy tắc ủy quyền cho ứng dụng lớp của tôi?


8

Câu hỏi này là về việc áp dụng các quy tắc của ứng dụng của tôi làm tôi bối rối.

Bộ điều khiển của tôi đang sử dụng dịch vụ và dịch vụ đang sử dụng kho lưu trữ.

public class CommentController: ApiController{

    [HttpPost]
    public bool EditComment(Comment comment){
        commentService.Update(comment);
    }
}

public class CommentService{
    ICommentRepository repository;
    ....
    ....
    public void Update(Comment comment){
        repository.Update(comment);
    }
}

Nếu người dùng được xác thực, anh ta có thể cập nhật một bình luận.

  • Nhưng một người dùng nên chỉnh sửa ý kiến ​​riêng.

  • Nhưng một quản trị viên có thể chỉnh sửa tất cả các ý kiến.

  • Nhưng bình luận không thể chỉnh sửa sau một ngày cụ thể.

  • Chỉnh sửa bởi một bộ phận

Và tôi có một cái gì đó giống như các quy tắc này.

Nếu tôi áp dụng quy tắc "bình luận riêng của người dùng chỉnh sửa" trong lớp dịch vụ, tôi sẽ thay đổi Cập nhật methot và truyền tham số của bộ điều khiển User.Identity.Name,

public class CommentService{
    ICommentRepository repository;
    ....
    ....
    public void Update(string updatedByThisUser, Comment comment){
        // if updatedByThisUser is owner of comment
        repository.Update(comment);
    }
}

Nhưng, có đúng là thay đổi hoạt động dịch vụ theo quy tắc?

Tôi bối rối một chút về nơi tôi có thể áp dụng các quy tắc. Trong bộ điều khiển hoặc trong dịch vụ hoặc trong kho lưu trữ.

Có cách nào nổi bật để làm điều này như các mẫu thiết kế.


Theo kinh nghiệm của tôi, việc áp dụng ủy quyền ở cấp Bộ điều khiển luôn là điều tốt. Bạn sẽ đặt một thuộc tính ủy quyền phía trên tên lớp Trình điều khiển như vậy: [Authorize(Roles="member, admin")]và bây giờ tất cả các phương thức hành động trong Trình điều khiển sẽ chỉ có thể được truy cập bởi người dùng trong vai trò "thành viên" hoặc "quản trị viên".
Alternatex

1
Nhưng, nếu tôi cần sử dụng dịch vụ của mình cho dự án máy tính để bàn và dự án trang web MVC, tôi nên áp dụng lại quy tắc ủy quyền cho tất cả các dự án.
barteloma

Câu trả lời:


1

tôi sẽ

  • tạo một Perm PermService riêng biệt thực hiện các phương thức như isUserAllowedTo(user, PermissionService.Permissiontype.Update, PermissionService.Topic.COMMENT, additionalContextRelevantParameters)
  • và gọi các PermissionServicephương thức trong bộ điều khiển, trong đó thông tin ngữ cảnh cần thiết (tức là từ phiên) có sẵn.

Bạn có thể thiết kế kiến ​​trúc của mình để gọi dịch vụ cấp phép trong CommentService. Nhưng tôi không khuyến nghị điều này bởi vì điều này sẽ thêm các phụ thuộc bổ sung vào dịch vụ (tức là phiên) khiến cho việc kiểm tra đơn vị dịch vụ trở nên khác biệt hơn nhiều


1

Đầu tiên, hãy dành chút thời gian để xem xét những gì dịch vụ bình luận thực sự chịu trách nhiệm. Điều này sẽ phụ thuộc vào yêu cầu cụ thể của bạn, và thậm chí có thể đánh giá tốt nhất của riêng bạn.

Nếu trách nhiệm của dịch vụ bình luận bị giới hạn trong việc cập nhật bất kỳ bình luận nào , thì những gì bạn đã viết là tốt. Trong trường hợp này, bạn sẽ cần xem xét một số logic điều kiện khác để kiểm tra xem có thể cập nhật bất kỳ nhận xét nào không. Bạn có thể sẽ làm điều này trong bộ điều khiển hoặc bạn có thể tạo một hệ thống phụ riêng để kiểm tra xem Người dùng có thể đăng bình luận hay không. Bạn có thể sử dụng lại điều này giống như bạn dự định sử dụng lại dịch vụ bình luận.

Nếu dịch vụ bình luận chịu trách nhiệm cập nhật nhận xét của người dùng , thì dịch vụ của bạn sẽ trở thành Cập nhật (Người dùng người dùng, Nhận xét nhận xét) và bạn có thể linh hoạt kiểm tra các quy tắc kinh doanh trong chính dịch vụ.

Bây giờ bạn đã rõ về ý định thiết kế của bạn là gì, bạn sẽ có sự rõ ràng về cách thực hiện giải pháp của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.