Lý lịch:
Hiện đang trong quá trình xây dựng API REST, sử dụng nút w / express và nó được sử dụng bởi một ứng dụng di động và cuối cùng là một trang web (dựa trên trình duyệt hiện đại).
Tôi đang cố gắng xác định cách tốt nhất để ủy quyền cho yêu cầu cập nhật / hành động của người dùng để họ chỉ được phép sửa đổi tài nguyên của chính họ. Các hành động sẽ xảy ra ở một tỷ lệ bán cao do đó mối quan tâm.
Lưu ý: Quyền sở hữu của các thực thể không thể được chuyển giao trong trường hợp sử dụng này.
Các giải pháp tiềm năng:
Giải pháp : Lưu trữ và duy trì danh sách từng tài nguyên của người dùng trong phiên máy chủ được hỗ trợ bởi thứ gì đó như reddis.
Mối quan tâm : Việc duy trì phiên phía máy chủ có tập hợp phức tạp riêng được chia tỷ lệ cụ thể với nhiều máy chủ. Điều này cũng vi phạm REST. do-session-thực sự vi phạm-yên tĩnh để biết thêm thông tin.
Giải pháp: Thực hiện truy vấn đọc trước truy vấn hành động / cập nhật của người dùng. IE đưa cho tôi các mục của người dùng này sau đó nếu trong danh sách tiến hành cập nhật.
Mối quan tâm: Chi phí đọc thêm mỗi khi người dùng hành động thay mặt cho tài nguyên.
Giải pháp: Truyền id người dùng xuống lớp db và biến nó thành một phần của bản cập nhật có điều kiện hoặc nếu bạn muốn có được sự ưa thích, hãy sử dụng thứ gì đó như bảo mật mức hàng của Postgres cho tài nguyên đó tùy thuộc vào phụ trợ dữ liệu.
Mối quan tâm: Điều này có vẻ hơi muộn trong vòng đời yêu cầu để kiểm tra xem tài nguyên có phải là người dùng yêu cầu hay không. Lỗi sẽ phải được ném lên từ phần cuối dữ liệu. Cùng một lưu ý, nó cũng sẽ hơi lạc lõng khi xem xét xác thực và ủy quyền dựa trên vai trò thường được thực hiện khi bắt đầu vòng đời yêu cầu. Việc thực hiện cũng phụ thuộc vào phụ trợ dữ liệu. Nó cũng đẩy logic kinh doanh vào phụ trợ dữ liệu.
Giải pháp: Phía khách hàng đã ký phiên các loại. Hoặc với JWT hoặc cookie được mã hóa / đã ký. Về cơ bản duy trì một phiên đáng tin cậy có chứa một danh sách các id tài nguyên của người dùng.
Mối quan tâm: Kích thước của phiên phía khách hàng. Thực tế là nó sẽ được gửi với mỗi yêu cầu ngay cả khi không cần thiết. Bảo trì trở nên cực kỳ phức tạp khi bạn giới thiệu khả năng nhiều phiên / khách hàng đang hoạt động. Làm thế nào bạn sẽ cập nhật trạng thái phía máy khách khi một tài nguyên được thêm vào một máy khách khác.
Giải pháp: Truyền mã thông báo cập nhật đã ký (JWT) hoặc url cho khách hàng với tài nguyên khi tài nguyên được tìm nạp. Hy vọng rằng khi một tài nguyên được cập nhật / hành động. Mã thông báo đã ký sẽ chứa id người dùng và id tài nguyên và bạn có thể dễ dàng xác minh đối với những mã đó.
Mối quan tâm: Trở nên phức tạp nếu quyền sở hữu tài nguyên có thể chuyển nhượng được nhưng trong trường hợp của tôi đó không phải là vấn đề đáng lo ngại. Giới thiệu sự phức tạp qua một lần đọc trước khi cập nhật. Hơi lạ phải không?
Suy nghĩ cuối cùng:
Tôi đang nghiêng về giải pháp cuối cùng, nhưng vì tôi không thấy nó xảy ra rất thường xuyên. Tôi tự hỏi liệu tôi có đang thiếu thứ gì không? hoặc có thể là một phần của mẫu thiết kế mà tôi không biết.