如何在Oracle Apex中基于用户角色实现自定义访问权限控制
Oracle APEX 角色自定义授权功能实现步骤
1. 提前准备权限存储表
首先创建一张表存储角色和表单的权限映射关系,示例表结构:
CREATE TABLE ROLE_PERMISSIONS ( PERM_ID NUMBER PRIMARY KEY, ROLE_NAME VARCHAR2(50) NOT NULL, -- 角色值,如MANAGER/EMPLOYEE FORM_CODE VARCHAR2(100) NOT NULL, -- 表单唯一标识,和页面别名一一对应 ACCESS_ALLOWED CHAR(1) CHECK (ACCESS_ALLOWED IN ('Y','N')), UPDATE_BY VARCHAR2(100), UPDATE_TIME DATE DEFAULT SYSDATE ); -- 建议加联合唯一约束,避免同一个角色同个表单重复配置 CREATE UNIQUE INDEX UK_ROLE_FORM ON ROLE_PERMISSIONS(ROLE_NAME, FORM_CODE);
2. 实现保存按钮功能
你当前的配置页复选框勾选后,按以下逻辑配置保存动作:
- 给每个复选框的返回值设为
Y,未选中默认返回N,每个复选框对应一个FORM_CODE - 给保存按钮绑定提交页面动作,新增一个PL/SQL类型的页面进程,代码示例:
-- 先清空当前选中角色的旧权限配置,避免重复数据 DELETE FROM ROLE_PERMISSIONS WHERE ROLE_NAME = :PXX_SELECTED_ROLE; -- 依次写入勾选的权限,PXX为你的页面编号,替换为实际页面项名 IF :PXX_FORM_ORDER = 'Y' THEN INSERT INTO ROLE_PERMISSIONS(PERM_ID, ROLE_NAME, FORM_CODE, ACCESS_ALLOWED) VALUES(SEQ_PERM_ID.NEXTVAL, :PXX_SELECTED_ROLE, 'FORM_ORDER', 'Y'); END IF; IF :PXX_FORM_LEAVE = 'Y' THEN INSERT INTO ROLE_PERMISSIONS(PERM_ID, ROLE_NAME, FORM_CODE, ACCESS_ALLOWED) VALUES(SEQ_PERM_ID.NEXTVAL, :PXX_SELECTED_ROLE, 'FORM_LEAVE', 'Y'); END IF; -- 其他表单权限按上述逻辑依次添加即可 COMMIT;
- 保存成功后可以加一个成功提示的动态动作,提升交互体验
3. 新建全局授权方案
这一步是控制用户访问表单的核心逻辑:
- 进入共享组件→授权方案→新建,类型选择「PL/SQL函数返回布尔值」
- 编写权限校验逻辑,示例代码:
DECLARE v_has_access CHAR(1); BEGIN -- 查询当前登录用户的角色是否有当前页面的访问权限 SELECT ACCESS_ALLOWED INTO v_has_access FROM ROLE_PERMISSIONS WHERE ROLE_NAME = :G_USER_ROLE -- 替换为你存储当前登录用户角色的应用级项 AND FORM_CODE = :APP_PAGE_ALIAS -- 每个表单页面设置唯一别名,和FORM_CODE保持一致 AND ROWNUM = 1; RETURN v_has_access = 'Y'; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN FALSE; -- 未配置权限默认禁止访问 END;
- 授权方案的「未授权时的提示信息」可以自定义为「您暂无当前页面的访问权限」
4. 绑定授权到对应表单
- 打开每个需要做权限控制的表单页面,在页面属性的「安全」分类下,选择刚才新建的授权方案即可
- 可选优化:给导航菜单的对应菜单项也绑定同一个授权方案,无权限的用户看不到对应菜单入口,体验更友好
你配置的自定义访问表单界面参考:
内容的提问来源于stack exchange,提问作者New User
相关产品推荐
相关产品推荐

