security_3_1412169 - ATBMHTTT-2017/lab02-1412169-1412302_1412304 GitHub Wiki
Security 3: Trưởng dự án chỉ được phép đọc, ghi thông tin chi tiêu của dự án mình quản lý (VPD).
Giải pháp:
- Tạo ra một policy function
- Lấy vị từ trả về từ function gán vào policy
Thực hiện:
Tạo ra 1 function Select_CHITIEU trả về vị từ là DUAN ứng với user là trưởng dự án, nếu user là trưởng phòng thì được xem hết thông tin ở bảng ChiTieu và sau đó gắn vào policy Select_CHITIEU để áp dụng cho bảng ChiTieu. Ý nghĩa.
Ví dụ từ mã nguồn:
Trong ví dụ này, chúng ta sẽ tạo ra Select_CHITIEU, gán function này vào policy và hủy hàm nếu có.
Tạo hàm chính sách
- Mục đích là để trảvề vị từ là maDA với session user là truongDA
CREATE OR REPLACE FUNCTION Select_CHITIEU (
p_schema IN VARCHAR2 DEFAULT NULL,
p_object IN VARCHAR2 DEFAULT NULL)
RETURN VARCHAR2
AS
duan varchar2(5);
num number;
BEGIN
Select count (*) into num from PhongBan where user = truongPhong;
if (num > 0) then // nếu là trưởng phòng thì được xem hết tất cả dữ liệu ở bảng ChiTieu
RETURN '';
ELSE
BEGIN
select MADA INTO duan from DUAN where TRUONGDA = USER;
RETURN 'DUAN='|| q'[']' || duan || q'[']';
END;
END IF;
EXCEPTION
WHEN OTHERS THEN RETURN '1 = 0';
END;
- Sau khi tạo hàm thành công thì gán hàm vừa tạo vào policy
Gán hàm vào chính sách
BEGIN
DBMS_RLS.add_policy
(object_schema => 'sys_bt1', // tên schema mà bạn muốn thực hiện chính sách bảo vệ
object_name => 'ChiTieu', // đối tượng mà bạn muốn bảo vệ
policy_name => 'S_U_ChiTieu', // tên policy
policy_function => 'Select_CHITIEU', // tên function vừa tạo
statement_types => 'SELECT, UPDATE'); // loại (Select, Insert, Update)
END;
Hủy hàm
BEGIN
DBMS_RLS.drop_policy
(object_schema => 'sys_bt1', // tên schema mà bạn muốn thực hiện chính sách hủy chính sách
object_name => 'NhanVien', // đối tượng mà bạn muốn bảo vệ
policy_name => 'S_U_ChiTieu'); // tên policy muốn hủy
END;