Oracle APEX自定义授权问题:非认证用户页面访问失败
问题分析与解决方案
你的问题核心是非认证用户访问页面时,现有CustomAuthorization方案执行查询会抛出NO_DATA_FOUND异常——因为users表中不存在公共用户(通常是APEX_PUBLIC_USER)的记录,同时你之前的页面授权设置逻辑完全搞反了。
步骤1:修复现有CustomAuthorization的报错问题
修改PL/SQL代码,增加非认证用户判断和异常处理,避免查询报错:
DECLARE is_admin_flag VARCHAR2(1); BEGIN -- 先判断是否为非认证公共用户 IF :APP_USER = 'APEX_PUBLIC_USER' THEN RETURN FALSE; -- 非认证用户不通过此admin授权 END IF; -- 查询当前用户的admin标识 SELECT is_admin INTO is_admin_flag FROM users WHERE UPPER(username) = UPPER(:APP_USER); RETURN (is_admin_flag = 'Y'); EXCEPTION WHEN NO_DATA_FOUND THEN RETURN FALSE; -- 用户不存在时直接拒绝访问 END;
步骤2:创建“仅允许非认证用户”的专属授权方案
如果你需要部分页面只对未登录用户开放,别用现有方案,新建一个授权方案:
- 进入APEX应用的Shared Components -> Authorization Schemes
- 点击Create,选择From Scratch
- 名称设为
Allow_Public_Only,类型选PL/SQL Function Returning Boolean - 输入以下代码:
BEGIN -- 判断当前用户是否为非认证的公共用户 RETURN :APP_USER = 'APEX_PUBLIC_USER'; END;
- 保存该授权方案
步骤3:给目标页面设置正确的授权
找到需要开放给非认证用户的页面,编辑页面属性:
- 切换到Security标签页
- 在Authorization Scheme下拉框中选择刚创建的
Allow_Public_Only - 保存设置
为什么之前的设置无效?
- 原CustomAuthorization没有处理非认证用户的查询异常,导致非认证用户访问时直接抛出错误
- “Must Not Be Public User”的逻辑是禁止公共用户访问,和你需要的“仅允许非认证用户”完全相反,所以设置后非认证用户会被拒绝
内容的提问来源于stack exchange,提问作者Dev Yego
相关产品推荐
相关产品推荐

