Oracle APEX如何基于用户角色配置SSO场景下的页面访问权限
Oracle APEX SSO场景下分级页面权限落地方案
以下方案全程基于APEX原生能力实现,不需要额外插件,所有逻辑都在应用内配置完成:
1. 全局存储当前登录用户角色
首先把SSO登录用户对应的角色存在全局安全应用项里,避免每次页面加载重复查库,同时防止前端篡改权限值:
- 进入共享组件→应用项,新建应用项
APP_USER_ROLE,范围选择「Application」,会话状态保护设置为Restricted - 不能从浏览器设置。 - 新建应用计算,触发时机选择「On New Session(新会话建立)」,也就是SSO登录完成、会话初始化时自动执行,PL/SQL逻辑如下:
BEGIN -- SSO登录后内置变量:APP_USER会自动存当前登录用户名,和employee表的Name字段匹配 SELECT role INTO :APP_USER_ROLE FROM employee WHERE UPPER(name) = UPPER(:APP_USER); -- 加UPPER避免大小写不一致导致匹配失败 EXCEPTION WHEN NO_DATA_FOUND THEN :APP_USER_ROLE := 'GUEST'; -- 不在员工表的用户默认给最低访客权限 END;
2. 导航菜单按角色隐藏无权限入口
配置后用户在导航栏看不到自己无权限的页面入口:
- 进入共享组件→导航菜单,编辑当前使用的主导航的每一个条目:
- Home、Calculate gross页面的菜单条目,不需要额外加权限条件,所有合法登录用户都可见
- My account页面的菜单条目,找到条件配置项,条件类型选「项等于值」,对应项选
APP_USER_ROLE,匹配值填Admin,仅Admin角色可见
3. 全局页面访问拦截(必做,防止URL越权)
注意:仅隐藏菜单无法阻止用户通过手动输入URL越权访问,该全局拦截步骤必须配置
仅隐藏菜单不够,用户手动输入页面URL可以直接绕过菜单,必须加全局拦截逻辑:
- 新建应用进程,触发时机选择
On Load: Before Header (page template header),也就是每个页面加载渲染前先执行权限校验,PL/SQL逻辑如下:
DECLARE v_allowed_page_list VARCHAR2(200); BEGIN -- 替换下面的数字为你自己应用对应页面的实际ID,可在页面设计器左上角查看页面ID IF :APP_USER_ROLE = 'Admin' THEN v_allowed_page_list := '1,2,3'; -- Admin允许访问所有页面:Home(1)、My account(2)、Calculate gross(3) ELSIF :APP_USER_ROLE = 'User' THEN v_allowed_page_list := '1,3'; -- User仅允许访问Home、Calculate gross ELSE v_allowed_page_list := '1'; -- 访客仅允许访问首页 END IF; -- 校验当前访问页面是否在允许列表内 IF INSTR(','||v_allowed_page_list||',', ','||:APP_PAGE_ID||',') = 0 THEN apex_util.set_session_state('P1_ERROR_TIP', '您无权限访问当前页面'); -- 无权限直接跳转回首页 apex_util.redirect_url(p_url => apex_util.prepare_url('f?p='||:APP_ID||':1:'||:APP_SESSION)); END IF; END;
后续新增页面时,只需要在对应角色的允许页面列表里加新页面ID即可,不需要改其他逻辑。
4. 可选优化:用授权方案统一维护权限规则
如果后续权限管控的组件、页面变多,可以把权限规则抽成全局授权方案,避免重复写判断逻辑:
- 进入共享组件→授权方案,新建两个授权方案:
- 方案名
IS_ADMIN,类型选「返回布尔值的PL/SQL函数」,代码写RETURN :APP_USER_ROLE = 'Admin'; - 方案名
IS_AUTH_USER,类型选「返回布尔值的PL/SQL函数」,代码写RETURN :APP_USER_ROLE IN ('Admin','User');
- 方案名
- 后续给菜单、页面、按钮、区域配置权限时,直接在对应组件的「授权」属性里选对应方案即可,维护效率更高。
验证方法
- 用Raj账号通过SSO登录,检查导航栏显示全部3个页面入口,直接输入My account页面URL可正常访问
- 用Bob账号通过SSO登录,检查导航栏仅显示Home、Calculate gross两个入口,手动输入My account页面URL会自动跳转回首页,显示无权限提示
内容的提问来源于stack exchange,提问作者kiric8494
相关产品推荐
相关产品推荐

