PostgreSQL Vượt Trội OpenFGA: Cách Một Đội Ngũ Cách Mạng Hóa Hệ Thống Ủy Quyền
Trong bối cảnh không ngừng phát triển của ngành phát triển phần mềm, các hệ thống ủy quyền đã trở thành những người bảo vệ thầm lặng cho các ứng dụng của chúng ta. Trong khi các giải pháp xác thực đã trở nên chuẩn hóa, thì ủy quyền vẫn là một vùng đất hoang dã nơi các nhà phát triển liên tục vật lộn với sự phức tạp, khả năng mở rộng và các vấn đề đồng bộ hóa. Cuộc thảo luận gần đây trong cộng đồng về quyết định của một nhóm viết lại triển khai OpenFGA của họ bằng PostgreSQL thuần túy đã châm ngòi cho một cuộc tranh luận sôi nổi về tương lai của các hệ thống ủy quyền.
Cơn Ác Mộng Đồng Bộ Hóa Châm Ngòi Cho Sự Đổi Mới
Thách thức cốt lõi thúc đẩy sự thay đổi kiến trúc này là vấn đề mà các nhà phát triển gọi là bài toán đồng bộ hóa. Khi dữ liệu ủy quyền tồn tại trong một hệ thống riêng biệt với cơ sở dữ liệu ứng dụng chính, mọi thay đổi đều trở thành một cơn ác mộng về sự phối hợp. Việc thêm người dùng, tổ chức hoặc tài nguyên mới đòi hỏi phải cập nhật ngay lập tức cho cả hai hệ thống, tạo ra các phụ thuộc mong manh và những lỗ hổng bảo mật tiềm ẩn.
Một bình luận viên đã nắm bắt hoàn hảo vấn đề cơ bản với các hệ thống ủy quyền lấy cảm hứng từ Zanzibar:
Đây là một vấn đề cơ bản với tất cả các hệ thống ủy quyền lấy cảm hứng từ Zanzibar, vốn yêu cầu tập trung hóa tất cả dữ liệu ủy quyền.
Nhóm phát triển nhận ra rằng việc duy trì hai kho dữ liệu riêng biệt đồng nghĩa với việc họ không thể tận dụng các tính năng gốc của PostgreSQL như xóa theo tầng, giao dịch và các ràng buộc khóa ngoại. Khi các yêu cầu tuân thủ GDPR buộc họ phải triển khai tính năng xóa tài khoản người dùng, họ nhận ra một sự thật đau lòng: hệ thống ủy quyền của họ không thể tự động xóa theo tầng như cơ sở dữ liệu chính của họ có thể làm.
Bài Toán Kết Hợp Tìm Kiếm và Ủy Quyền
Một điểm thảo luận quan trọng khác nổi lên xoay quanh thách thức kết hợp ủy quyền với chức năng tìm kiếm. Khi bạn cần cung cấp kết quả được phân trang, lọc dựa trên quyền của người dùng, việc có dữ liệu ủy quyền trong một hệ thống riêng biệt sẽ tạo ra những trở ngại đáng kể về hiệu suất và độ phức tạp.
Tìm kiếm muốn là một thứ riêng biệt, và ủy quyền cũng vậy. Vậy làm thế nào để tôi có được một danh sách phân trang các kết quả đã được ủy quyền? Bạn phải lọc trước hoặc có dịch vụ tìm kiếm gọi đến dịch vụ ủy quyền. Cuộc sống sẽ dễ dàng hơn khi cơ sở dữ liệu chính có thể xử lý mọi thứ.
Nhận xét này làm nổi bật sự căng thẳng trong kiến trúc giữa các dịch vụ chuyên biệt và hệ thống thống nhất. Cộng đồng đã thảo luận về các giải pháp khác nhau, từ các phương pháp lọc trước và lọc sau đến các khung nhìn vật chất hóa phức tạp hơn để phi chuẩn hóa dữ liệu ủy quyền trở lại cơ sở dữ liệu ứng dụng.
Một số nhà phát triển chia sẻ kinh nghiệm của họ với việc duy trì các bảng ánh xạ để tra cứu quyền nhanh chóng, chỉ để nhận ra rằng việc cập nhật dữ liệu ngày càng trở nên lộn xộn theo thời gian. Sự đồng thuận dường như là: trong khi các dịch vụ ủy quyền bên ngoài mang lại lợi ích về mặt lý thuyết, thì chi phí triển khai thực tế thường lớn hơn lợi thế đối với các ứng dụng đang phát triển.
So sánh các Phương pháp Phân quyền
| Phương pháp | Tên đầy đủ | Đặc điểm chính | Trường hợp sử dụng tốt nhất |
|---|---|---|---|
| RBAC | Role-Based Access Control | Người dùng có vai trò với các quyền được định nghĩa trước | Ứng dụng đơn giản với hệ thống phân cấp vai trò rõ ràng |
| PBAC | Policy-Based Access Control | Các chính sách JSON/YAML xác định tiêu chí truy cập | Quản trị API, hệ thống doanh nghiệp |
| ABAC | Attribute-Based Access Control | Truy cập dựa trên thuộc tính của người dùng/tài nguyên/môi trường | Yêu cầu bảo mật chi tiết |
| ReBAC | Relationship-Based Access Control | Truy cập dựa trên mối quan hệ giữa các thực thể | Ứng dụng cộng tác như Google Drive |
Giải Pháp PostgreSQL: Sự Đơn Giản Gặp Gỡ Sức Mạnh
Quyết định của nhóm triển khai logic ủy quyền trực tiếp trong PostgreSQL thể hiện một cách tiếp cận trở về cơ bản, thách thức các giáo điều về kiến trúc microservices hiện đại. Bằng cách tạo một bảng authz_model để định nghĩa lược đồ ủy quyền của họ và một khung nhìn authz_relationship tính toán các bộ dữ liệu theo yêu cầu từ các bảng quan hệ có sẵn, họ đã loại bỏ hoàn toàn vấn đề đồng bộ hóa.
Hàm check_permission của họ trở thành công cụ chính của hệ thống, duyệt đệ quy qua đồ thị ủy quyền được định nghĩa trong mô hình của họ. Cách tiếp cận này cho phép họ duy trì triết lý kiểm soát truy cập dựa trên mối quan hệ trong khi vẫn tận dụng được khả năng hỗ trợ giao dịch mạnh mẽ và các tính năng toàn vẹn dữ liệu của PostgreSQL.
Phản ứng của cộng đồng đối với cách tiếp cận này tuy trái chiều nhưng nhìn chung là tích cực. Một số nhà phát triển bày tỏ sự ngạc nhiên trước hiệu quả của việc lưu trữ logic trong cơ sở dữ liệu, lưu ý rằng thật thú vị khi thấy điều đó có thể hoạt động bất chấp xu hướng hiện tại ủng hộ các dịch vụ bên ngoài. Những người khác yêu cầu cập nhật về hiệu suất lâu dài, đặc biệt là về chi phí tính toán khi tạo các mối quan hệ ủy quyền theo yêu cầu.
Các Thành Phần Triển Khai PostgreSQL
- Bảng authz_model: Lưu trữ các định nghĩa schema ủy quyền với các quy tắc về kiểu, quan hệ và kế thừa
- View authz_relationship: Tính toán các bộ tuple quan hệ theo yêu cầu từ các bảng cơ sở dữ liệu hiện có
- Hàm check_permission: Đánh giá đệ quy các truy vấn ủy quyền dựa trên model
- Các script tiện ích: Quản lý việc di chuyển schema và quy trình phát triển
Tương Lai Của Các Hệ Thống Ủy Quyền
Nghiên cứu điển hình này đặt ra những câu hỏi quan trọng về thời điểm sử dụng các dịch vụ ủy quyền chuyên biệt so với các giải pháp cơ sở dữ liệu tích hợp. Đối với các ứng dụng quy mô nhỏ đến trung bình, cách tiếp cận PostgreSQL mang lại những lợi thế hấp dẫn về sự đơn giản và tính nhất quán của dữ liệu. Tuy nhiên, khi các ứng dụng mở rộng quy mô lên số lượng người dùng khổng lồ với các cấu trúc quyền phức tạp, khả năng mở rộng chuyên biệt của các hệ thống như OpenFGA và SpiceDB có thể trở nên cần thiết.
Cuộc thảo luận cũng tiết lộ các giải pháp mới nổi kết nối cả hai thế giới, chẳng hạn như các trình bao bọc dữ liệu ngoại cho phép PostgreSQL tham gia JOIN một cách tự nhiên với các dịch vụ ủy quyền bên ngoài, và các phương pháp vật chất hóa đồng bộ dữ liệu ủy quyền trở lại cơ sở dữ liệu ứng dụng.
Điều rõ ràng từ cuộc trò chuyện của cộng đồng là không có một giải pháp một cỡ vừa cho tất cả cho vấn đề ủy quyền. Cách tiếp cận tối ưu phụ thuộc vào các yếu tố như quy mô ứng dụng, quy mô nhóm, yêu cầu tuân thủ và cơ sở hạ tầng hiện có. Như một nhà phát triển đã lưu ý, khả năng thích ứng nhanh chóng các mô hình ủy quyền trong các môi trường linh hoạt đang ngày càng trở nên quan trọng.
Việc viết lại thành công trong PostgreSQL của nhóm chứng minh rằng đôi khi giải pháp sáng tạo nhất cũng là giải pháp đơn giản nhất. Bằng cách lùi lại một bước khỏi các hệ thống phân tán phức tạp và tận dụng các tính năng mạnh mẽ vốn có trong cơ sở dữ liệu của họ, họ đã tạo ra một hệ thống ủy quyền vừa dễ bảo trì hơn vừa đáng tin cậy hơn — chứng minh rằng trong thế giới phát triển phần mềm, đôi khi cách tốt nhất để tiến lên là lùi lại một bước.
Tham khảo: How we rewrote OpenFGA in pure Postgres
