| Oracle FAQ | Your Portal to the Oracle Knowledge Grid | |
Home -> Community -> Usenet -> c.d.o.server -> SA_SESSION.SET_ACCESS_PROFILE does not work for PROXY connections, any idea why?
I have a situation where I need to set the OLS access profile (and
LABEL) for a user after database login and only after I verified the
user's security level from an LDAP server. The implementation work
fine for normal connections, but users that connect via a PROXY account
does not seem to inherit the rights of the proxy account even though
privileged to change the ACCESS_PROFILE.
What am I missing and what should be changed? Help is very much appreciated.
I need to use Proxy users and their credentials are locked up in a LDAP server so I need to check if they can select data only after they have been verified. So I can not define their access rights beforehand.
See below my test script that demonstrates the problem:
drop user midtiersrv cascade;
drop user secman cascade;
drop user midtieruser cascade;
--My AppServer User Also proxy user
create user midtiersrv identified by midtiersrv quota unlimited on
users;
--My Security Manager schema
create user secman identified by secman;
--My Middel Tier User
create user midtieruser identified externally;
--Setup MidTier User as user who can only connect through midtiersrv
proxy user
alter user midtieruser grant connect through midtiersrv;
grant connect to midtieruser;
grant connect to midtiersrv ;
grant connect to secman ;
grant dba to secman ; --To save time
grant unlimited tablespace to secman ;
alter user lbacsys identified by lbacsys account unlock;
connect lbacsys/lbacsys
EXEC sa_sysdba.drop_policy(policy_name => 'TEST1POL');
--Create my Policy
BEGIN
sa_sysdba.create_policy(policy_name => 'TEST1POL',
column_name => 'TEST1POL_LABEL',
default_options => 'READ_CONTROL');
END;
grant execute on sa_components to secman; grant execute on sa_label_admin to secman; grant execute on sa_user_admin to secman;grant execute on char_to_label to secman;
connect secman/secman
--Create levels
begin
sa_components.create_level(policy_name => 'TEST1POL',
long_name => 'SECRET',
short_name => 'SEC',
level_num => 10);
sa_components.create_level(policy_name => 'TEST1POL',
long_name => 'NOTSECRET',
short_name => 'NOT',
level_num => 5);
end;
sa_label_admin.create_label(policy_name => 'TEST1POL',
label_tag => 1,
label_value => 'SEC');
sa_label_admin.create_label(policy_name => 'TEST1POL',
label_tag => 2,
label_value => 'NOT');
end;
--Authorize Users, this is where the problem comes in.S
begin
sa_user_admin.set_user_labels
(policy_name => 'TEST1POL',
user_name => 'CLEARED_USER',
max_read_label => 'SEC');
sa_user_admin.set_user_labels
(policy_name => 'TEST1POL',
user_name => 'NOTCLEARED_USER',
max_read_label => 'NOT');
-- I can not set label for MIDTIERUSER since this users
create table midtiersrv.test as select rownum aid from all_objects
where rownum < 100;
grant select on midtiersrv.test to midtieruser;
--Apply pplicy for good
BEGIN
sa_policy_admin.remove_table_policy
(policy_name => 'TEST1POL',
schema_name => 'MIDTIERSRV',
table_name => 'TEST');
sa_policy_admin.apply_table_policy
(policy_name => 'TEST1POL',
schema_name => 'MIDTIERSRV',
table_name => 'TEST',
table_options => 'READ_CONTROL');
END;
exec sa_session.set_access_profile ('TEST1POL','CLEARED_USER'); select count (*) "CLEARED Policy Set" ,
sa_session.label ('TEST1POL') SEC_LABEL from midtiersrv.test ;
exec sa_session.set_access_profile ('TEST1POL','NOTCLEARED_USER'); select count (*) "NOTCLEARED User Policy Set",
sa_session.label ('TEST1POL') SEC_LABEL from midtiersrv.test ;
create or replace package secman_pkg as
procedure set_access;
end;
/
create or replace package body secman_pkg as
procedure set_access as
v_ldap_result varchar2(100);
begin
create or replace context test_context using secman.secman_pkg;
prompt Normal Connection from MIDTIERSRV
connect midtiersrv/midtiersrv
select sys_context ('TEST_CONTEXT','SECLEVEL') Context from dual;
select count(*) "No Access Set",
sa_session.label('TEST1POL') SEC_LABEL from midtiersrv.test;
prompt Proxy Connection of MIDTIERUSER via MIDTIERSRV connect midtiersrv[midtieruser]/midtiersrv select sys_context ('TEST_CONTEXT','SECLEVEL') Context from dual; select count(*) "No Access Set",
sa_session.label('TEST1POL') SEC_LABEL from midtiersrv.test; Received on Tue Aug 01 2006 - 13:52:26 CDT
![]() |
![]() |