【问题标题】:Custom authorization for pages in oracle apexoracle apex中页面的自定义授权
【发布时间】:2018-05-27 12:54:15
【问题描述】:

如何为页面创建授权架构?

例如:我有

  • 页面如page1page2page3page4
  • 用户为user1user2user3user4

当我登录时

  • user1 应该只获取 page1 和 page4
  • user2 --> page2 和 page3
  • user3 --> page1 和 page3
  • user4 --> page2 和 page4

即在priv 表中存储页码和用户。布尔返回值函数对组件有效,但对页面显示错误。

如何为上述角色编写授权架构?

【问题讨论】:

  • 到目前为止你尝试了什么?

标签: oracle-apex


【解决方案1】:

1 - 转到共享组件

2 - 点击授权方案

3 - 创建“PL/SQL 函数返回布尔值”类型的新方案

4 - 您的函数应返回“false”以拒绝访问

在这个 pl/sql 代码中,您可以访问 :APP_USER 变量和 :APP_PAGE_ID(页码)。

如果你有一个函数接收用户和页面并返回一个布尔值检查他是否有访问权限,那么就这样做:

BEGIN
   RETURN MYFUNCTION(:APP_USER, :APP_PAGE_ID);
END;

5 - 转到“编辑应用程序属性”>“安全”并选择您的 授权方案。

6 - 您不需要为每个页面设置授权方案,只需执行第 5 步即可。


我不知道你的桌子怎么样。但是假设它有两列像

USER       PAGE_NUMBER
user1       1
user1       4
user2       2
user2       3
user3       1
user3       3
user4       2
user4       4

所以你的函数看起来像这样:

CREATE OR REPLACE FUNCTION "MYFUNCTION" (p_user IN VARCHAR2, p_page_number IN NUMBER) 
RETURN BOOLEAN AS

v_count NUMBER := 0;

BEGIN

SELECT count(*) INTO v_count
FROM mytable 
WHERE user = p_user AND page_number = p_page_number;

IF v_count = 0 THEN
   RETURN false;
END IF;

RETURN true;

END;

【讨论】:

  • 你能把你的函数代码和你在页面授权方案上使用的pl/sql代码贴出来吗?只需编辑您的原始问题。
【解决方案2】:

您应该考虑自定义授权方案和身份验证方案..

1- 为用户创建一个表来存储每个用户名和密码,并为“user_type”放置一个列,在此列中您将拥有您拥有的用户类型,例如:“dev”代表开发人员和“adm” ' 对于管理员等等...

2- 创建一个 plsql 函数,该函数返回一个布尔值(真/假),基于 一个查询,它将您从用户那里获得的用户名和密码与存储在您的用户表中的用户名和密码进行比较。 此函数还将设置“会话变量”以传递用户名和 成功登录后的 user_type,类似于:

apex_util.set_session_state('SESSION_U_TYPE',temp_type);

apex_util.set_session_state('SESSION_USER_NAME',in_username); 

3- 在您的应用程序的共享组件中,使用您在函数中使用的完全相同的名称创建“应用程序项”(此处为 SESSION_U_TYPE、SESSION_USER_NAME)

4- 编辑您的“登录”页面并删除或注释掉默认代码并使用您的函数并通过绑定变量传递用户名和密码

5-现在再次转到共享组件并创建自定义授权方案,为其命名并选择“SQL存在”作为类型并编写一个sql 查询以检查当前用户的 user_type,例如:

SELECT * FROM my_users 
WHERE user_name = :SESSION_USER_NAME AND user_type = 'dev';

重复此步骤以根据需要创建任意数量的“访问级别”

6- 最后,转到每个页面并在安全部分下选择 您希望允许访问此页面的方案或用户级别

-- 注释:

    • 这是一个快速的解决方案(但工作正常),您可以对其进行许多改进,例如您应该创建一个过程来处理登录并将参数传递给身份验证函数
    • 您必须对密码进行哈希处理,因为您不应该以纯文本形式存储密码!

希望对你有用

【讨论】:

    【解决方案3】:

    如果我们将组件 ID 与页面 ID 一起保存并检查组件,则上述带有返回布尔函数的授权模式适用于组件

    但是对于页面授权,它不起作用并显示错误。 用上面的表结构和功能测试过

    enter image description here

    【讨论】:

    • 你能把你的函数代码和你在页面授权方案上使用的pl/sql代码贴出来吗?
    • 我使用了与上述相同的功能进行页面授权
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多