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;