如何配置用户可见导航菜单项?基于apex_application_list_entries求助
实现APEX用户创建页面关联导航菜单权限的方案
1. 创建自定义权限存储表
首先需要一张表来存储用户与可访问导航菜单项的关联关系——apex_application_list_entries是系统视图,仅存储菜单项定义,不保存用户权限数据:
CREATE TABLE USER_MENU_PERMISSIONS ( USER_ID VARCHAR2(100) NOT NULL, -- 关联APEX用户的USER_NAME或ID LIST_ENTRY_ID NUMBER NOT NULL, -- 关联apex_application_list_entries的LIST_ENTRY_ID CONSTRAINT UMP_PK PRIMARY KEY (USER_ID, LIST_ENTRY_ID), CONSTRAINT UMP_FK_LIST_ENTRY FOREIGN KEY (LIST_ENTRY_ID) REFERENCES APEX_APPLICATION_LIST_ENTRIES (LIST_ENTRY_ID) );
2. 在用户创建页面添加多选列表项
在用户创建页面新增一个**Select List(Multiple)**类型的页面项,配置如下:
- Name:比如
PXX_SELECTED_MENU_ITEMS(XX替换为你的页面编号) - Type:Select List(Multiple)
- List of Values > SQL Query:查询当前应用的所有导航菜单项,替换
YOUR_NAV_LIST_NAME为你的导航菜单名称(可在APEX应用的「Shared Components > Lists」中找到):
SELECT entry_text AS display_value, list_entry_id AS return_value FROM apex_application_list_entries WHERE application_id = :APP_ID AND list_name = 'YOUR_NAV_LIST_NAME' ORDER BY sequence;
- Storage > Session State Protection:按需设为「Unrestricted」或其他合适级别
3. 处理页面提交的权限存储逻辑
在用户创建页面的Processing区域,新增一个PL/SQL Process,触发时机设为「After Submit」,用于保存选中的权限记录:
-- 若为编辑用户页面,先删除该用户已有权限(创建用户可省略此步) DELETE FROM user_menu_permissions WHERE user_id = :PXX_USER_NAME; -- 替换为页面上用户名字段的项名 -- 插入选中的菜单项权限 FOR i IN (SELECT column_value AS list_entry_id FROM TABLE(apex_string.split(:PXX_SELECTED_MENU_ITEMS, ':'))) LOOP INSERT INTO user_menu_permissions (user_id, list_entry_id) VALUES (:PXX_USER_NAME, i.list_entry_id); END LOOP;
4. 配置导航菜单的权限检查
进入「Shared Components > Lists」,找到你的导航菜单,编辑菜单项(可批量设置默认条件后再调整个别项):
- Condition Type:选择「PL/SQL Expression」
- Expression:写入判断当前用户是否有权限的逻辑,两种方式可选:
方式一(直接查询):
方式二(复用授权方案):先在「Shared Components > Authorization Schemes」创建名为EXISTS ( SELECT 1 FROM user_menu_permissions WHERE user_id = :APP_USER AND list_entry_id = :LIST_ENTRY_ID )USER_MENU_ACCESS的授权方案,把上述查询逻辑封装进去,然后表达式写:APEX_AUTHORIZATION.IS_ALLOWED( p_authorization_name => 'USER_MENU_ACCESS', p_parameter1 => :APP_USER, p_parameter2 => :LIST_ENTRY_ID )
额外提示
- 确保用户创建页面的用户名字段与权限表的
USER_ID字段匹配(通常用APP_USER对应的用户名) - 若导航菜单项有层级,可补充权限继承逻辑:比如用户能访问子菜单项时,自动允许父菜单项显示
- 可添加权限清理逻辑,比如删除用户时同步删除其权限记录
内容的提问来源于stack exchange,提问作者Retal Omar
相关产品推荐
相关产品推荐

