Next we grant the appropriate authorisation on the OLS packages to the test user:CONNECT system/password@w2k1;
CREATE USER ols_test IDENTIFIED BY password DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp;
GRANT CONNECT, RESOURCE, SELECT_CATALOG_ROLE TO ols_test;
CONNECT lbacsys/lbacsys@w2k1
GRANT EXECUTE ON sa_components TO ols_test WITH GRANT OPTION;
GRANT EXECUTE ON sa_user_admin TO ols_test WITH GRANT OPTION;
GRANT EXECUTE ON sa_user_admin TO ols_test WITH GRANT OPTION;
GRANT EXECUTE ON sa_label_admin TO ols_test WITH GRANT OPTION;
GRANT EXECUTE ON sa_policy_admin TO ols_test WITH GRANT OPTION;
GRANT EXECUTE ON sa_audit_admin TO ols_test WITH GRANT OPTION;
GRANT LBAC_DBA TO ols_test;
GRANT EXECUTE ON sa_sysdba TO ols_test;
GRANT EXECUTE ON to_lbac_data_label TO ols_test;
CONNECT ols_test/password@w2k1
BEGIN
SA_SYSDBA.CREATE_POLICY(
policy_name => 'region_policy',
column_name => 'region_label');
END;
/
GRANT region_policy_DBA TO ols_test;
EXECUTE SA_COMPONENTS.CREATE_LEVEL('region_policy',20,'L1','Level 1');
EXECUTE SA_COMPONENTS.CREATE_LEVEL('region_policy',40,'L2','Level 2');
EXECUTE SA_COMPONENTS.CREATE_LEVEL('region_policy',60,'L3','Level 3');
EXECUTE SA_COMPONENTS.CREATE_COMPARTMENT('region_policy',100,'M','MANAGEMENT');
EXECUTE SA_COMPONENTS.CREATE_COMPARTMENT('region_policy',120,'E','EMPLOYEE');
EXECUTE SA_COMPONENTS.CREATE_GROUP('region_policy',20,'R20','REGION NORTH');
EXECUTE SA_COMPONENTS.CREATE_GROUP('region_policy',40,'R40','REGION SOUTH');
EXECUTE SA_COMPONENTS.CREATE_GROUP('region_policy',60,'R60','REGION EAST');
EXECUTE SA_COMPONENTS.CREATE_GROUP('region_policy',80,'R80','REGION WEST');
EXECUTE SA_USER_ADMIN.SET_USER_PRIVS('region_policy','ols_test','FULL,PROFILE_ACCESS');
CONNECT ols_test/password@w2k1
CREATE TABLE customers (
id NUMBER(10) NOT NULL,
cust_type VARCHAR2(10),
first_name VARCHAR2(30),
last_name VARCHAR2(30),
region VARCHAR2(5),
credit NUMBER(10,2),
CONSTRAINT customer_pk PRIMARY KEY (id));
GRANT SELECT, INSERT, UPDATE, DELETE ON customers TO PUBLIC;
INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
VALUES ( 1, 'SILVER', 'Harry', 'Hill', 'NORTH', 11000.00);
INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
VALUES ( 2, 'SILVER', 'Vic', 'Reeves', 'NORTH', 2000.00);
INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
VALUES ( 3, 'SILVER', 'Bob', 'Mortimer', 'WEST', 500.00);
INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
VALUES ( 4, 'SILVER', 'Paul', 'Whitehouse', 'SOUTH', 1000.00);
INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
VALUES ( 5, 'SILVER', 'Harry', 'Enfield', 'EAST', 20000.00);
INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
VALUES ( 6, 'GOLD', 'Jenifer', 'Lopez', 'WEST', 500.00);
INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
VALUES ( 7, 'GOLD', 'Kylie', 'Minogue', 'NORTH', 1000.00);
INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
VALUES ( 8, 'GOLD', 'Maria', 'Carey', 'WEST', 1000.00);
INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
VALUES ( 9, 'GOLD', 'Dani', 'Minogue', 'SOUTH', 20000.00);
INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
VALUES (10, 'GOLD', 'Whitney', 'Houston', 'EAST', 500.00);
INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
VALUES (11, 'PLATINUM', 'Robbie', 'Williams', 'SOUTH', 500.00);
INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
VALUES (12, 'PLATINUM', 'Thom', 'Yorke', 'NORTH', 2000.00);
INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
VALUES (13, 'PLATINUM', 'Gareth', 'Gates', 'WEST', 10000.00);
INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
VALUES (14, 'PLATINUM', 'Darius', 'Dinesh', 'EAST', 2000.00);
INSERT INTO customers (id, cust_type, first_name, last_name, region, credit)
VALUES (15, 'PLATINUM', 'Will', 'Young', 'EAST', 100.00);
COMMIT;
CREATE OR REPLACE FUNCTION get_customer_label (
p_cust_type IN VARCHAR2,
p_region IN VARCHAR2,
p_credit IN NUMBER)
RETURN LBACSYS.LBAC_LABEL AS
v_label VARCHAR2(80);
BEGIN
IF p_credit > 2000 THEN
v_label := 'L3:';
ELSIF p_credit > 500 THEN
v_label := 'L2:';
ELSE
v_label := 'L1:';
END IF;
IF p_cust_type = 'PLATINUM' THEN
v_label := v_label || 'M:';
ELSE
v_label := v_label || 'E:';
END IF;
IF p_region = 'NORTH' THEN
v_label := v_label || 'R20';
ELSIF p_region = 'SOUTH' THEN
v_label := v_label || 'R40';
ELSIF p_region = 'EAST' THEN
v_label := v_label || 'R60';
ELSIF p_region = 'WEST' THEN
v_label := v_label || 'R80';
END IF;
RETURN TO_LBAC_DATA_LABEL('region_policy',v_label);
END get_customer_label;
/
SHOW ERRORS
CONNECT ols_test/password@w2k1
BEGIN
SA_POLICY_ADMIN.APPLY_TABLE_POLICY(
policy_name => 'REGION_POLICY',
schema_name => 'OLS_TEST',
table_name => 'CUSTOMERS',
table_options => 'NO_CONTROL');
END;
/
UPDATE customers
SET region_label = CHAR_TO_LABEL('REGION_POLICY','L1');
COMMIT;
BEGIN
SA_POLICY_ADMIN.REMOVE_TABLE_POLICY('REGION_POLICY','OLS_TEST','CUSTOMERS');
SA_POLICY_ADMIN.APPLY_TABLE_POLICY (
policy_name => 'REGION_POLICY',
schema_name => 'OLS_TEST',
table_name => 'CUSTOMERS',
table_options => 'READ_CONTROL,WRITE_CONTROL,CHECK_CONTROL',
label_function => 'ols_test.get_customer_label(:new.cust_type,:new.region,:new.credit)',
predicate => NULL);
END;
/
UPDATE customers
SET first_name = first_name;
COMMIT;
CONNECT system/password@w2k1;
CREATE USER sales_manager IDENTIFIED BY password;
CREATE USER sales_north IDENTIFIED BY password;
CREATE USER sales_south IDENTIFIED BY password;
CREATE USER sales_east IDENTIFIED BY password;
CREATE USER sales_west IDENTIFIED BY password;
GRANT CONNECT TO sales_manager, sales_north, sales_south, sales_east, sales_west;
CONNECT ols_test/password@w2k1
BEGIN
SA_USER_ADMIN.SET_USER_LABELS(
'region_policy','sales_manager','L3:M,E:R20,R40,R60,R80');
SA_USER_ADMIN.SET_USER_LABELS(
'region_policy','sales_north','L3:E:R20,R40');
SA_USER_ADMIN.SET_USER_LABELS(
'region_policy','sales_south','L3:E:R20,R40,R60,R80');
SA_USER_ADMIN.SET_USER_LABELS(
'region_policy','sales_east','L3:E:R60');
SA_USER_ADMIN.SET_USER_LABELS(
'region_policy','sales_west','L3:E:R80');
END;
/
For further information see: Oracle Label Security Administrator's Guide Release 2 (9.2)CONNECT sales_manager/password@w2k1
SELECT * FROM ols_test.customers;
CONNECT sales_north/password@w2k1
SELECT * FROM ols_test.customers;
CONNECT sales_south/password@w2k1
SELECT * FROM ols_test.customers;
CONNECT sales_east/password@w2k1
SELECT * FROM ols_test.customers;
CONNECT sales_west/password@w2k1
SELECT * FROM ols_test.customers;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9466564/viewspace-609390/ ,如需转载,请注明出处,否则将追究法律责任。