首页 文章

PL / SQL oracle管理访问控制

提问于
浏览
1

我正在尝试基于此语句在oracle中解决存储过程... oracle数据库的访问控制在哪里

a)允许每个用户在一天的特定时限内访问系统 . 例如,允许user1从上午8点到下午4点访问系统,而允许user2从下午3点到晚上11点访问系统 .

b)对于每个用户,帐户将在三次登录失败时被锁定 .

c)对于每个用户,空闲会话将在10分钟后终止 .

d)允许高权限用户同时拥有最多两个并发会话,而允许其他用户只有一个并发会话 .

我设法使用 Profiles 回答b,c,d问题 . 然后我将用户更改为配置文件 . 存储过程不断给我编译错误 . 提前感谢这是我的工作

create role roleUser;
    grant create session to roleUser;
    grant select on staff_data to roleUser;  
    create user user1 identified by abc123;
    create user user2 identified by abc123;
    --common user privilege 
    create profile userProfile limit
    FAILED_LOGIN_ATTEMPTS 3
    IDLE_TIME 10
    SESSIONS_PER_USER 1


    --high user  privilege
    create profile userHighProfile limit
    FAILED_LOGIN_ATTEMPTS 3
    IDLE_TIME 10
    SESSIONS_PER_USER 2

    alter user user1 profile userProfile;
    alter user user2 profile userHighProfile;
    grant roleUser to user1,user2;


    show error;
    create or replace trigger limit_logon 
    after logon on database
    begin
    if to_char(sysdate,'HH24') between 8 and 16 then
    set roleUser to user1;
    elsif to_char(sysdate,'HH24') between 15 and 23 then
    set roleUser to user2;
    else
    revoke roleUser  from user1;
    revoke roleUser from user2;
    end if;
    end;

3 回答

  • 0

    我可以想象你有一个包含用户在其中被允许登录时间范围的表,当你登录触发器在用户登录会核对用户的范围(一个或多个)当前时间 . 创建一个过程或函数来封装逻辑,如果当时不允许用户登录则让它引发错误 .

    当然,这不会在窗口结束时将用户注销 .

    我有一种感觉,你还需要在这里是一个定期运行检查所有会话一个DBMS_SCHEDULER工作,允许用户在那个时候进行登录,从而使用户的,如果他们保持过去的窗口登录会话可以被杀死 .

  • 0

    set roleUser to user1; 必须 execute immediate 'grant roleUser to user1';

    revoke roleUser from user1; 必须 execute immediate 'revoke roleUser from user1';

    然而,由于需要的,因为GRANT / REVOKE的角色是执行 after 登录,这样就不会影响当前会话将无法正常工作,用户首先必须注销并重新登录 .

    您可以启用和禁用授予的角色,而不是授予和撤消角色,这会立即生效,请参阅SET ROLE .

    无论如何,为了您的目的,最简单的解决方案应该是这个:

    create or replace trigger limit_logon 
    after logon on database
    begin
        if USER = 'USER1' AND to_char(sysdate,'HH24') NOT between 8 and 16 then
            RAISE_APPLICATION_ERROR (-20001, 'Logon allowed only from 8 to 16');
        END IF;
        if USER = 'USER2' AND to_char(sysdate,'HH24') NOT between 15 and 23 then
            RAISE_APPLICATION_ERROR (-20001, 'Logon allowed only from 15 to 23');
        END IF;
    end;
    
  • 1

    您可以使用连接到Axiomatics数据访问过滤器的Oracle虚拟专用数据库(免责声明 - 我为Axiomatics工作) . 在数据访问过滤器中,您可以定义基于时间的访问控制策略,还包括其他参数,例如用户或数据属性 .

    这是最干净,最可持续的方式 .

相关问题