因此,Apex拥有“工作空间”,可让您创建三种类型的用户 - 所有这些都是组织内部的。此外,Apex上的个别网站的开发人员似乎无法为其网站提供“用户”。
我错过了什么吗?
我需要能够让外部(业务)用户能够访问网站的某些功能,例如,会计只能看到A和B页,而高管可以看到A,B和C 。
我需要能够拥有几组具有不同访问权限的人。
这只能通过创建工作区/组来完成吗?或者这可以在我的网站上内部完成吗?
答案 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。
或者,您可以直接在授权方案中执行SQL来检查访问权限:
(NB“user_roles”和“role_pages”是我编写的名称,代表您的表格)
答案 1 :(得分:7)
我只想扩展Tony's answer,这本身就是正确的。我只想向您展示另一种方式,我认为这对初学者来说会更容易,并且省略了表格的创建。
如果您的应用程序使用Apex作为身份验证方案,那么您的用户将通过管理工作区本身进行管理。您可以创建,编辑和删除用户,但您也可以定义组,并将用户链接到组。您可以创建多个“最终用户”类型的用户,并定义几个组,例如“高管”。
创建组后,转到要将此组分配给的用户,并将该组添加到该用户的组
完成设置后,您仍需要授权方案。事实上你仍然需要一些pl / sql知识,但是由于一些方便的api-work,可以将编码保持在最低限度。 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。
这样我就可以只将新用户添加到他们合适的组中,他们也可以访问较低级别的应用程序。