policy_VPD_04_1312366 - ATBMHTTT-2017/lab01-1312366-1312454-1412185 GitHub Wiki

Yêu cầu:Tất cả nhân viên bình thường (trừ trưởng phòng, trưởng chi nhánh và các trưởng dự án) chỉ được phép xem thông tin nhân viên trong phòng của mình, chỉ được xem lương của bản thân (VPD).

Mô tả cách thực hiện:

  1. Xác định 2 nhóm đối tượng.

Nhóm 1: có giữ ít nhất 1 chức vụ: trưởng phòng, trưởng dự án, trưởng chi nhánh. Nhóm này được quyền xem toàn bộ thông tin trên bảng Nhân Viên.

Nhóm 2: là Nhân viên không giữ các chức vụ như trên. chỉ được xem thông tin các nhân viên cùng phòng và thông tin lương của bản thân.

  1. Cách Xác định 1 nhân viên thuộc nhóm 1 nhay nhóm 2?

sử dụng trigger kết hợp proc KiemTraNhanVienKhongGiuChucVu, proc này sẽ kiểm tra mã nhân viên hiện tại ( thông qua sys_context('userenv','SESSION_USER')) có trùng với mã nhân viên là trưởng dự án, trưởng chi nhánh, trưởng phòng hay không. nếu không giữ bất kỳ chức vụ nào thì sẽ set context với giá trị là 1 , ngược lại nếu có giữ ít nhất 1 chức vụ thì sẽ set context với giá trị là 0.

  1. các hàm chính sách bảo mật: gồm 2 hàm chính sách:

ThongTinCaNhan_Policy : hàm này cho nhân viên không giữ chức vụ chỉ xem các thông tin nhân viên khác trong phòng ban của mình. đầu tiên hàm này sẽ gọi context đã tạo ở bước 2) để xác định nhân viên thuộc nhóm nào. Nếu thuộc nhóm 1 sẽ trả về 1 mệnh đề đúng (1=1), khí đó nhóm này được xem toàn bộ thông tin. nếu không sẽ trả về 1 mệnh đề có dạnh NHANVIEN_1312366_1312454_1412185.maphong=sys_context(''NhanVien_context'',''MaPhong'')'- context này có chức năng lấy mã phòng của nhân viên đấy, như vậy nhóm 2 chỉ được xem các thông tin thuộc phòng ban của mình.

ThongTinLuong_Policy: hàm này cho nhân viên không giữ chức vụ chỉ xem lương của chính bản thân mình, các giá trị lương của nhân viên khác sẽ hiện giá trị NULL. Tương tự hàm chính sách trên, cần kiểm tra nhân viên thuộc nhóm 1 hay 2.Nhóm 1 sẽ trả về 1 mệnh đề đúng, nếu thuộc nhóm 2 thì sẽ trả về mệnh đề NHANVIEN_1312366_1312454_1412185.MaNV=sys_context(''userenv'',''SESSION_USER''). hàm này chỉ áp dụng với riêng cột chứa thông tin lương. như vậy vấn đề được giải quyết.

  1. Vấn đề conflict giữa trigger lấy thông tin và hàm policy, cách giải quyết.

ở đây có 1 vấn đề Xung đột như sau: trigger định lấy thông tin của bảng được gán hàm chính sách. hàm chính sách lại gọi context( được gán bởi trigger, nhưng lúc này chưa có dữ liệu để gán)-> xảy ra lỗi.

Cách giải quyết:

-ở đầu mỗi trigger tạo context, ta set context 1 giá trị khóa quy ước. Giá trị này khác với các giá trị context định set, và cũng khác với những giá trị tương ứng trong bảng dữ liệu. ví dụ: set_context('NhanVien_context','MaPhong','P00') , set_context('NhanVien_context','KiemTraNhanVienKhongGiuChucVu',2)

-ở đầu tất cả các hàm policy, ta kiểm gia tất cả các context có trùng với giá trị khóa quy ước hay không. Nếu trùng, tức là lúc này đang là trigger, ta trả về 1 mệnh đề đúng ( '1=1' ) để không áp dụng chính sách với các truy vấn này.

ví dụ trong bài: if((sys_context('NhanVien_context','MaPhong') ='P00') or (sys_context('NhanVien_context','KiemTraNhanVienKhongGiuChucVu')=2)) then return '1=1'; end if;

-thực tế ta không cần thiết phải kiểm tra tất cả những trigger và policy không liên quan đến nhau, để giảm số lần kiểm tra. tuy nhiên điều naỳ không cần thiết do số lượng context là không lớn, và dễ mắc lỗi.