policy_VPD_06_1412185 - ATBMHTTT-2017/lab01-1312366-1312454-1412185 GitHub Wiki
Yêu cầu:Trưởng phòng chỉ được phép đọc thông tin chi tiêu của dự án trong phòng ban mình quản lý. Với những dự án không thuộc phòng ban của mình, các trưởng phòng được phép xem thông tin chi tiêu nhưng không được phép xem số tiền cụ thể (VPD).
Mô tả cách thực hiện:
-
Xác định bước chuẩn bị: Lấy thông tin mã nhân viên của truong_phong, phòng ban mà truong_phong đó phụ trách, và dự án mà phòng ban quản lý. Để lấy những thông tin này, ta tạo một packet(NhanVien_pkg) thực thi procedure (GetThongTinNhanVien) lấy các thông tin đó và gán bằng lệnh DBMS_SESSION.set_context.
-
Tạo một Trigger (Set_ThongTinNhanVien) after logon database để trigger thực thi mỗi lần có kết nối vào database. Khi có nhân viên kết nối vào database thì trigger sẽ chạy procedure NhanVien_pkg.GetThongTinNhanVien lấy thông tin nhân viên và gán vào context ThongTinNhanVien.
-
Gán quyền exec trigger và procedure cho public, để phòng trường hợp mọi người kết nối vào database.
-
Tạo Function để thực hiện chính sách. Nếu username = 'BT1N28' thì trả về '1=1' là giá trị luôn đúng. Nếu giá trị PHONGBAN = null có nghĩa đó là một nhân viên bình thường, vì thế ta return '0=1' là giá trị luôn sai, vì thế không thể đọc được giá trị. Trường hợp cuối nếu PHONG_BAN khác null thì có nghĩa nhân viên là một truong_phong. Lúc này ta trả về giá trị của DUAN = dự án mà ta đã lấy từ bước 1.
-
Bước cuối cùng ta thêm vào policy. Để giải quyết việc truong_phong chỉ đọc thông tin của phòng mình quản lý, nhưng chỉ xem được thông tin chi tiêu trừ số tiền chi tiêu của phòng ban mình không quản lý, ta thêm 2 thuộc tính: * sec_relevant_cols => 'SOTIEN' * sec_relevant_cols_opt=>dbms_rls.ALL_ROWS
Như vậy với việc sử dụng package thực thi store procedure, ta đã đơn giản hoá được việc lấy thông tin của user để sử dụng cho VPD, thay vì phải tạo những câu truy vấn phức tạp để tìm thông tin của nhân viên.