Trường hợp ủy quyền phù hợp trong một kiến ​​trúc lớp?


24

Thông thường, tôi đặt các quyết định ủy quyền trong bộ điều khiển phía máy chủ của mình. Đây là những điểm cuối RESTful gần đây, nhưng tôi nghĩ tương tự như vậy đối với kiến ​​trúc kiểu MVC. Vì lợi ích của tranh luận giả định rằng đó là ủy quyền dựa trên vai trò. Một phương thức được bảo vệ sẽ được chú thích hoặc thực hiện kiểm tra và trả lại 403 nếu cần thiết.

Bây giờ, cho rằng ủy quyền trên thực tế là một quy tắc kinh doanh - "chỉ quản trị viên mới có thể liệt kê X", tôi nghĩ rằng họ nên bị đẩy xuống một lớp. Khi bộ điều khiển yêu cầu lớp nghiệp vụ thực hiện thao tác, lớp dịch vụ hoặc lớp nghiệp vụ thông báo cho bộ điều khiển không được ủy quyền.

Đây có phải là một cách tiếp cận hợp lý? Có những bất lợi cho điều này?

Tôi không thích có Dịch vụ ủy quyền về cơ bản chứa một loạt các quy tắc được mã hóa theo thủ tục tĩnh để thực hiện việc này nhưng có lẽ sẽ hợp lý khi giữ tất cả logic truy cập ở một nơi. Nó có phải là một mối quan tâm xuyên suốt nên được giữ riêng biệt?

Vì vậy, tôi đang hỏi liệu có ai đã làm điều này không và làm thế nào họ đạt được nó một cách sạch sẽ hoặc nếu có bất kỳ tài nguyên tốt nào tôi có thể đọc. Tôi đang sử dụng Java fwiw nhưng đây là một câu hỏi bất khả tri về ngôn ngữ.

Tôi đã kiểm tra các câu hỏi liên quan ở đây và chúng rất mỏng trên mặt đất và câu trả lời. Ví dụ: Xác thực và ủy quyền trong các mô hình miền và thực hiện điều đó thông qua một lớp dịch vụ cho MVC

Tôi đang đọc các tài liệu bảo mật mùa xuân , đưa ra một số lập luận tốt cho nó là mối quan tâm xuyên suốt, nhưng tôi lo lắng đó chỉ là "con đường mùa xuân" và muốn có quan điểm rộng hơn. Nó cũng liên kết ứng dụng của bạn với một khung cụ thể.


1
Tình trạng 403 là sai đối với các vấn đề ủy quyền. Sử dụng 401.
gnasher729

@ gnasher729 Tôi nghĩ đó là ngược. 401 có nghĩa là xác thực đã thất bại hoặc không được cung cấp, 403 có nghĩa là bạn không có quyền truy cập: stackoverflow.com/questions/3297048/ợi
JimmyJames

@JimmyJames, có một trường phái khác cho rằng bạn chỉ nên sử dụng một trong số họ cho tất cả các lỗi xác thực và ủy quyền vì nó không cho phép các công cụ tự động suy luận logic kinh doanh dễ dàng. Có một số thời gian.
Berin Loritsch

1
@BerinLoritsch Xin lỗi, bạn có nói rằng ý tưởng là làm cho khó hiểu hơn nếu đó là vấn đề xác thực hoặc ủy quyền? RFC có vẻ khá rõ ràng nhưng nói rằng bạn có thể sử dụng 404 thay vì 403 nếu bạn không muốn tiết lộ quá nhiều thông tin. Có tài liệu tham khảo nào bạn có thể cung cấp cho đối số để sử dụng 401 thay vì 403 không?
JimmyJames

@JimmyJames, vâng. Quá trình suy nghĩ này đến từ các chuyên gia bảo mật, không phải nhà phát triển. Và tôi cũng đã thấy đề xuất của bạn về 404 để ẩn hoàn toàn thông tin để che giấu rằng tài nguyên thậm chí còn tồn tại.
Berin Loritsch

Câu trả lời:


9

Thực hành tốt của nó là chỉ hiển thị các tùy chọn mà người dùng được ủy quyền.

Lực lượng này ủy quyền là một mối quan tâm xuyên suốt. "Chế độ xem" cần biết người dùng được phép làm gì trước khi có thể xây dựng các tùy chọn và menu để hiển thị.

Mặt sau không nên tin tưởng vào mặt trước để đưa ra quyết định bảo mật vì vậy phải tự kiểm tra ủy quyền.

Có thể có các quy tắc kinh doanh có hiệu lực ủy quyền tùy thuộc vào dữ liệu, ví dụ: "Chỉ những người dùng có số dư trên 5000 đô la mới có thể thực hiện chuyển khoản ngoại tệ" hoặc "Chỉ người dùng ở Trụ sở chính mới có thể xem các tài khoản này". Vì vậy, một số logic ủy quyền được yêu cầu trong logic kinh doanh.

Ngoài ra còn có các ủy quyền kỹ thuật để xem xét - ai được phép xem nhật ký, ai có thể sao lưu / khôi phục cơ sở dữ liệu, v.v.

Vì vậy, cuối cùng, mọi thành phần trong bạn có thể có một số yêu cầu bảo mật và / hoặc ủy quyền cụ thể, trong thực tế, gần như không thể gói nó thành một "lớp ủy quyền" riêng biệt.


7

Tôi nghĩ rằng đó là cách tiếp cận hoàn toàn hợp lý để thu hút ủy quyền trong lớp Dịch vụ của bạn. Bạn cần bảo vệ dịch vụ của mình khỏi việc thực hiện các hoạt động trái phép (đặc biệt là sửa đổi dữ liệu). Lớp Dịch vụ của bạn có thể nằm trong một thư viện và được sử dụng bởi các lớp Trình bày khác nhau (bạn có thể có các ứng dụng UI khác nhau, sử dụng cùng một lớp Dịch vụ). Và bạn không thể dựa vào thực tế là các lớp Trình bày cụ thể thực hiện xác nhận cần thiết. Điều này đặc biệt quan trọng nếu bạn sẽ quyết định sau đó chuyển lớp Dịch vụ của mình sang quy trình riêng biệt (ví dụ: theo cách tiếp cận của SOA).

Bây giờ về cách đạt được điều này một cách "sạch sẽ". Tôi không thích ý tưởng xả rác logic kinh doanh bằng kiểm tra ủy quyền, vì vậy một số triển khai cụ thể của phương pháp tiếp cận lập trình hướng theo khía cạnh có thể giúp ích: đó có thể là trang trí các phương thức dịch vụ với các thuộc tính đặc biệt hoặc sử dụng proxy động với các can thiệp.

Và quan trọng, tôi cần phải thừa nhận rằng trong các dự án rất đơn giản, có thể, bạn có thể sống mà không cần xác nhận riêng biệt, chỉ để đơn giản hóa cuộc sống của bạn. Nhưng điều quan trọng là đừng bỏ lỡ thời điểm khi "dự án đơn giản" bắt đầu trở thành "dự án phức tạp".


7

Tôi thích đẩy séc ủy quyền xuống thấp nhất có thể! (Nhưng không còn nữa!)

Bạn vẫn có thể tự do viết các bài kiểm tra ủy quyền tự động đối với các lớp "bên trên" này. Và một số quy tắc chỉ có thể được áp dụng hoặc có ý nghĩa trong các lớp cao hơn như lớp dịch vụ của bạn (CanView / CanSerialize?). Nhưng, tôi thường nghĩ rằng chiến lược ủy quyền an toàn nhất cũng là chiến lược "DRY-est": Giữ ủy quyền càng thấp càng tốt, trong mã "chung" hoặc "chia sẻ" nhất có thể (mà không làm phức tạp quá nhiều quy tắc xác thực).

Hãy suy nghĩ về sự thay thế. Nếu quy tắc uỷ quyền của bạn được kiểm tra và thi hành chỉ trong lớp dịch vụ, rời khỏi tên miền tội nghiệp của các đối tượng để uốn cong vào ý chí của một đối tượng dịch vụ ủ rũ, bạn sẽ thường xuyên được yêu cầu để thực thi từng quy tắc cá nhân nhiều hơn một lần, trong nhiều đối tượng và nhiều đặt trong mỗi đối tượng, và trong mã phức tạp hơn.

Hơn nữa, khi nhóm phân tích của bạn thuê một công ty tư vấn để viết các dịch vụ báo cáo bằng cách sử dụng các đối tượng miền của bạn, bạn không muốn phải tin tưởng các nhà phát triển đó! (Hoặc bất cứ điều gì Bạn xây dựng các dịch vụ bổ sung hoặc các cuộc gọi qua các đối tượng tương tự cho. Bất kỳ Bạn sẽ không muốn để crack mở cuốn sách lớn của quy tắc kinh doanh và lý trí.) Hy vọng để thực thi những quy tắc đúng một lần nữa ; bạn muốn tên miền của bạn đã biết họ và thực thi chúng.


@Shoe Nếu tôi hiểu mối quan tâm của bạn - đó là loại điểm. Nếu chỉ có "quản trị viên" có quyền, theo quy tắc kinh doanh, để tạo một Widget, quy tắc tương tự sẽ được áp dụng ở mọi nơi. (Vì vậy, đừng mạo hiểm để bất cứ ai bỏ qua nó!) Nếu quy tắc không được áp dụng ở mọi nơi, thì đó không thực sự là quy tắc về Widgetschỉ Widgets . . Đẩy các quy tắc xuống càng xa càng tốt (các quy tắc riêng lẻ) có thể đi; nhưng, không xa như "quy tắc" có thể đi ... Tôi cảm thấy như mình không nói rõ sự khác biệt. Nhưng, đáng lẽ phải có sự phân biệt ở đó.
Svidgen

Theo kinh nghiệm của tôi, quy tắc ủy quyền thường là một phần của quy tắc kinh doanh. Như vậy, "càng xa càng tốt" thường là lớp miền của tôi. Nhưng, tôi nghi ngờ rằng việc các quy tắc "nên" của bạn rơi xuống chỉ là hậu quả của tên miền của bạn, bản chất của các quy tắc và cách doanh nghiệp nói về chúng.
Svidgen
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.