【问题标题】:PL/SQL oracle managing access controlPL/SQL oracle 管理访问控制
【发布时间】:2013-12-30 00:41:56
【问题描述】:

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

a) 每个用户都可以在一天的特定时间限制内访问系统。例如,user1 可以在早上 8 点到 4 点访问系统,而 user2 可以在下午 3 点到 11 点访问系统。

b) 对于每个用户,帐户将在登录失败 3 次后被锁定。

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

d) 高权限用户一次最多可以有两个并发会话,而其他用户只能有一个并发会话。

我设法使用个人资料回答了 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;

【问题讨论】:

  • The stored procedure keep give me compilation error. 如果你也发布错误信息就好了。

标签: oracle security syntax-error access-control


【解决方案1】:

我想您会有一个表格,其中包含允许用户登录的时间范围,并且当用户登录时,您的登录触发器将根据用户的范围检查当前时间。创建一个过程或函数来封装逻辑,如果当时不允许用户登录,则让它报错。

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

我有一种感觉,您在这里还需要一个 DBMS_Scheduler 作业,该作业会定期运行以检查当时是否允许所有会话的用户登录,以便如果用户的会话保持登录状态,则可以将其杀死过去他们的窗口。

【讨论】:

    【解决方案2】:

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

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

    但是,由于 GRANT/REVOKE ROLE 是在登录之后执行的,因此它不会按预期工作,因此它不会影响当前会话,用户必须先注销并重新登录。

    您可以启用和禁用授予的角色,而不是授予和撤销角色,这会立即生效,请参阅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;
    

    【讨论】:

      【解决方案3】:

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

      这是最清洁、最可持续的方式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-02
        • 2021-07-21
        • 2018-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-20
        • 1970-01-01
        相关资源
        最近更新 更多