Oracle APEX中如何禁止跨工作区访问页面?
Apex 19工作区隔离问题:非法跨区访问返回登录页而非404的解决办法
问题根源
Apex 19默认的权限校验逻辑是先识别URL里的应用ID,再检查用户有没有该应用的访问权限。当WS1的用户改URL成/ws1/f?p=200:1访问WS2的应用200时,系统只会检测到用户没权限访问应用200,不会直接判定“工作区不匹配”,所以触发了默认的登录重定向,而不是返回404。
解决方法
1. 给工作区设置允许的应用ID范围
- 登录Apex的内部管理工作区,进入「工作区管理」→「工作区属性」
- 分别给WS1和WS2配置「允许的应用ID范围」:
- WS1只填100、101
- WS2只填200、201
- 保存后,用户在WS1上下文访问非允许的应用ID时,Apex会返回权限错误,之后你可以把这个错误映射成404页面。
2. 把权限错误映射到404页面
- 进入每个工作区的应用(比如WS1的100、101)的「共享组件」→「错误处理」→「错误页面」
- 新建或修改规则,把
ORA-20987这类Apex权限错误码,映射到你自定义的404错误页面。
3. 用Web服务器(比如OHS)加URL重写规则
如果前端用的是Oracle HTTP Server,直接用mod_rewrite强制校验工作区和应用ID的匹配:
- 编辑OHS的配置文件(比如
httpd.conf或者虚拟主机配置),添加以下规则:
RewriteEngine On # 限制/ws1/路径只能访问应用100、101 RewriteRule ^/ws1/f\?p=(100|101):.*$ - [L] RewriteRule ^/ws1/f\?p=.*$ /404.html [R=404,L] # 限制/ws2/路径只能访问应用200、201 RewriteRule ^/ws2/f\?p=(200|201):.*$ - [L] RewriteRule ^/ws2/f\?p=.*$ /404.html [R=404,L]
- 重启OHS使规则生效,这样非法URL直接被Web服务器返回404,不用走Apex的权限校验流程。
4. 应用全局页面加前置校验
在每个应用的「页面0」(全局页面)添加一个前置PL/SQL进程:
DECLARE l_workspace_name VARCHAR2(100); l_allowed_apps VARCHAR2(100); BEGIN -- 获取当前应用所属的工作区 SELECT workspace INTO l_workspace_name FROM apex_applications WHERE application_id = :APP_ID; -- 定义各工作区允许的应用ID IF l_workspace_name = 'WS1' THEN l_allowed_apps := '100,101'; ELSIF l_workspace_name = 'WS2' THEN l_allowed_apps := '200,201'; ELSE l_allowed_apps := ''; END IF; -- 检查当前应用ID是否在允许列表里 IF NOT REGEXP_LIKE(l_allowed_apps, :APP_ID) THEN apex_util.redirect_url('/404.html'); apex_application.stop_apex_engine; END IF; END;
- 这个逻辑会在页面加载前校验应用是否属于当前工作区,不符合就直接跳转到404页面。
内容的提问来源于stack exchange,提问作者Cris
相关产品推荐
相关产品推荐

