Là một sự bổ sung cho
Phần lý thuyết được mô tả rõ ràng trong tài liệu
Bài viết không có gì mới, không có ẩn ý hay kiến thức bí mật. Chỉ là một bản phác thảo về việc thực hiện thực tế một ý tưởng lý thuyết. Nếu ai quan tâm thì đọc nhé. Nếu bạn không quan tâm, đừng lãng phí thời gian của bạn.
Báo cáo sự cố
Không đi sâu vào lĩnh vực chủ đề, một cách ngắn gọn, vấn đề có thể được hình thành như sau: Có một bảng thực hiện một thực thể kinh doanh nhất định. Các hàng trong bảng có thể bị xóa nhưng các hàng không thể bị xóa về mặt vật lý; chúng phải được ẩn đi.
Vì người ta nói: “Đừng xóa bất cứ thứ gì, chỉ cần đổi tên nó. Internet lưu trữ MỌI THỨ"
Trong quá trình thực hiện, bạn không nên viết lại các hàm được lưu trữ hiện có hoạt động với thực thể này.
Để thực hiện khái niệm này, bảng có thuộc tính bị xóa. Sau đó, mọi thứ đều đơn giản - bạn cần đảm bảo rằng khách hàng chỉ có thể nhìn thấy các dòng trong đó thuộc tính bị xóa SAI Cơ chế được sử dụng để làm gì? Bảo mật cấp hàng.
Thực hiện
Tạo một vai trò và lược đồ riêng biệt
CREATE ROLE repos;
CREATE SCHEMA repos;
Tạo bảng mục tiêu
CREATE TABLE repos.file
(
...
is_del BOOLEAN DEFAULT FALSE
);
CREATE SCHEMA repos
Chúng tôi gồm có Bảo mật cấp hàng
ALTER TABLE repos.file ENABLE ROW LEVEL SECURITY ;
CREATE POLICY file_invisible_deleted ON repos.file FOR ALL TO dba_role USING ( NOT is_deleted );
GRANT ALL ON TABLE repos.file to dba_role ;
GRANT USAGE ON SCHEMA repos TO dba_role ;
Chức năng dịch vụ - xóa một hàng trong bảng
CREATE OR REPLACE repos.delete( curr_id repos.file.id%TYPE)
RETURNS integer AS $$
BEGIN
...
UPDATE repos.file
SET is_del = TRUE
WHERE id = curr_id ;
...
END
$$ LANGUAGE plpgsql SECURITY DEFINER;
Chức năng kinh doanh — xóa một tài liệu
CREATE OR REPLACE business_functions.deleteDoc( doc_for_delete JSON )
RETURNS JSON AS $$
BEGIN
...
PERFORM repos.delete( doc_id ) ;
...
END
$$ LANGUAGE plpgsql SECURITY DEFINER;
Những phát hiện
Khách hàng xóa tài liệu
SELECT business_functions.delCFile( (SELECT json_build_object( 'CId', 3 )) );
Sau khi xóa, khách hàng không thấy tài liệu
SELECT business_functions.getCFile"( (SELECT json_build_object( 'CId', 3 )) ) ;
-----------------
(0 rows)
Nhưng trong cơ sở dữ liệu tài liệu không bị xóa, chỉ thay đổi thuộc tính is_del
psql -d my_db
SELECT id, name , is_del FROM repos.file ;
id | name | is_del
--+---------+------------
1 | test_1 | t
(1 row)
Đó là những gì được yêu cầu trong báo cáo vấn đề.
Tổng
Nếu chủ đề thú vị, trong nghiên cứu tiếp theo, bạn có thể đưa ra ví dụ về cách triển khai mô hình dựa trên vai trò để phân tách quyền truy cập dữ liệu bằng cách sử dụng Bảo mật cấp hàng.
Nguồn: www.habr.com