Oracle Apex 中的授权和用户角色?

Posted

技术标签:

【中文标题】Oracle Apex 中的授权和用户角色?【英文标题】:Authorization and user roles in Oracle Apex? 【发布时间】:2011-12-15 20:25:19 【问题描述】:

Apex 具有“工作区”,可让您创建三种类型的用户 - 所有这些用户本质上都是组织内部的。此外,Apex 上单个站点的开发人员似乎无法为他的站点拥有“用户”。

我错过了什么吗?

我需要让外部(业务)用户能够访问网站的某些功能,例如,会计只能看到页面 A 和 B,而高管可以看到 A、B 和 C .

我需要能够拥有几组具有不同访问权限的人。

这只能通过创建工作区/组来完成吗?或者这可以在我的网站内部完成吗?

【问题讨论】:

【参考方案1】:

我知道这已经很老了,但是 Google 把我带到了这里,所以我会试着带上我的 5 美分。 Tom's answer 帮了我很多,但我想利用 APEX 的团体补助金。例如,我有用户组:基本用户、高级用户和管理员用户。较高的用户级别也应该可以访问较低级别的应用程序/页面。如果我使用 APEX_UTIL.CURRENT_USER_IN_GROUP 我需要检查所有应该有权访问的组。如果我添加另一个用户组,我必须将该组添加到每个应用程序的授权方案中。而且所有用户都需要在他们有权访问的所有组中。

我的解决方案是同时检查 APEX 中的 Group Grants。首先,我将用户添加到管理员用户组。之后,我将基本用户和高级用户组添加到管理员用户组。这还不够,APEX 不会为基本用户的应用程序授予管理员用户访问权限,并且 APEX_UTIL.CURRENT_USER_IN_GROUP 也不知道这些。于是我对PL/SQL做了一些调整,我的授权方案如下:

DECLARE
    isInGroup BOOLEAN;
    userID    NUMBER(30);
    authGroup VARCHAR2(40);
    
    BEGIN
        authGroup := 'Basic User';                  -- User group to look for
        isInGroup := false;
        userID    := APEX_UTIL.GET_CURRENT_USER_ID;
    
        FOR a IN (
            SELECT wf.group_name AS group FROM wwv_flow_group_users wf WHERE wf.user_id = userID
            UNION
            SELECT gg.group_name FROM wwv_flow_group_users gu 
            RIGHT JOIN apex_workspace_group_groups gg ON gg.grantee_name = gu.group_name
            WHERE user_id = userID) 
        LOOP
            IF a.group = authGroup THEN
                isInGroup := true;
            END IF;
        END LOOP;
    
    RETURN isInGroup;
    END;

UNION 之前的第一个 SELECT 获取当前用户所属的所有组的名称,在我的例子中只有管理员用户。 UNION 之后的第二个 SELECT 是第一个选择中的组授予访问权限的所有组的列表。在我的情况下,基本用户和高级用户。这一大堆在 LOOP 中迭代,如果其中一个组等于开头定义的 authGroup,则返回 true。

这样我可以将新用户添加到他们的适当组中,并且他们还可以访问低级别应用程序。

【讨论】:

【参考方案2】:

授权是确定是否允许经过身份验证/识别的人访问资源或执行操作的过程。它基于分配给用户的一组特权或角色。例如,在 Oracle 数据库中,管理员有权安排作业,而用户则不能。 授权与身份验证有何不同? 身份验证和授权通常一起工作。换句话说,授权遵循身份验证。 身份验证决定你是谁? 授权决定你可以做什么?

【讨论】:

【参考方案3】:

虽然 APEX 有一个称为“组”的内置用户管理概念,但我必须承认我从未使用过它,并且快速阅读文档并不能让我清楚您如何使用它们来控制访问(但请参阅此处的Tom's answer)。

您可能需要在数据库中创建用户/角色表,并将这些表与 APEX 授权方案结合使用来控制对页面的访问。可以使用函数体创建“PL/SQL 函数返回布尔值”类型的单个授权方案:

return my_auth_pkg.is_authorized (p_user    => :app_user,
                                  p_app_id  => :app_id
                                  p_page_id => :app_page_id);

然后您将实施该包以查找用户的权限并决定是否为应用程序和页面 ID 返回 TRUE 或 FALSE。

或者,您可以直接在授权方案中执行 SQL 来检查访问:

(注意“user_roles”和“role_pages”是我编的名字,代表你的表)

【讨论】:

创建时,请在 APEX 授权方案的“函数体”属性中输入。 啊好吧。那么这也是我将创建检查以查看我的数据库表是否包含正确信息的地方? 我应该在哪里声明/定义 is_authorized? 在您在服务器上创建的包中。您需要了解 PL/SQL。 在 PL/SQL 中搜索 Dummies【参考方案4】:

我只想扩展Tony's answer,这本身就是正确的。我只是想向您展示另一种方式,我认为这对初学者来说会更容易,并且省略了表格的创建。

如果您的应用程序使用 Apex 作为身份验证方案,那么您的用户将通过工作区本身的管理进行管理。您可以创建、编辑和删除用户,但您也可以定义组,并将用户链接到组。您可以创建多个“最终用户”类型的用户,并定义几个组,例如“Executives”。

创建组后,转到要分配此组的用户,然后将该组添加到该用户的组中

设置完成后,您仍然需要授权方案。事实仍然是你需要一些 pl/sql 知识,但是由于一些方便的 api 工作,可以将编码保持在最低限度。 current_user_in_group 执行它所说的:它检查当前用户是否已经分配了组。通过使用一些简单的 IF 结构进行一些扩展,您可以将其提升一点!

并不是说我会完全推荐这种方法,我自己觉得它有点乏味,而且您需要有人进入 APEX 来实际维护用户及其组,但这很可能在您的环境中是可以接受的。但是,您可以使用它开始。您可以非常轻松地切换身份验证方案,并通过更改您的授权方案使其符合新的身份验证方案,之后您可以轻松快速地进行调整。当然,这取决于您的优先事项和目标。

【讨论】:

+1 太好了,现在我知道如何使用内置组了!在回答之前,我查看了 apex_util 文档,但没有看到该功能。只是一个观察:您在表达式 1 中的代码可以简化为; return apex_util.current_user_in_group(p_group_name=>'Executives'); 我在这里实现了你的答案,汤姆,它确实在限制访问方面很有效。事实上,我再也无法进入登录页面了。 XD 我该如何解决?我应该注意我在应用程序级别应用了授权方案,而不是页面级别。我是否必须在应用程序级别关闭授权,并真正单独通过并限制对每个页面的访问? @TraxusIV 哇,抱歉回复晚了!我认为这可能与您的 apex 版本有关,以后版本的 apex 不应该再这样做了(我相信)。可能从 4.2 及更高版本开始。除此之外,是的,您需要直接分配。不过不要担心,您可以通过转到实用程序 > 选择右侧边栏上的跨页实用程序 > 所有页面的网格编辑来相对轻松地做到这一点。您可以在那里轻松更改所有页面的授权方案。不要忘记保存! :)

以上是关于Oracle Apex 中的授权和用户角色?的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE数据库中的权限和角色

如何以编程方式将用户添加到 Oracle APEX 4.x 中的访问控制列表?

Oracle用户授权角色管理

Oracle Apex 中文本项字段中的字符限制

Oracle-Apex 分拣穿梭车

Oracle Apex - 动态检查不在报告中的复选框项目