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

时间:2011-10-26 15:40:16

标签: security permissions authorization roles oracle-apex

因此,Apex拥有“工作空间”,可让您创建三种类型的用户 - 所有这些都是组织内部的。此外,Apex上的个别网站的开发人员似乎无法为其网站提供“用户”。

我错过了什么吗?

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

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

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

4 个答案:

答案 0 :(得分:7)

虽然APEX有一个名为“Groups”的内置用户管理概念,但我必须承认我从未使用它,并且快速阅读文档并不能让我清楚如何使用它们来控制访问(但是请点击此处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。 enter image description here

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

(NB“user_roles”和“role_pages”是我编写的名称,代表您的表格)

答案 1 :(得分:7)

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

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

Apex users and groups Creation of a group 创建组后,转到要将此组分配给的用户,并将该组添加到该用户的组

Adding a group to a user

完成设置后,您仍需要授权方案。事实上你仍然需要一些pl / sql知识,但是由于一些方便的api-work,可以将编码保持在最低限度。 Defining an authorization based on apex groups current_user_in_group执行它所说的内容:它会检查当前用户是否已分配所述组。随着一些使用一些简单的IF结构的扩展,你可以稍微提升一点!

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我知道这已经很旧了,但 Google 把我带到了这里,所以我会尽量带上我的五美分。 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。

这样我就可以只将新用户添加到他们合适的组中,他们也可以访问较低级别的应用程序。