You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:创建“仅允许非认证用户”的专属授权方案

如果你需要部分页面只对未登录用户开放,别用现有方案,新建一个授权方案:

  1. 进入APEX应用的Shared Components -> Authorization Schemes
  2. 点击Create,选择From Scratch
  3. 名称设为Allow_Public_Only,类型选PL/SQL Function Returning Boolean
  4. 输入以下代码:
BEGIN
 -- 判断当前用户是否为非认证的公共用户
 RETURN :APP_USER = 'APEX_PUBLIC_USER';
END;
  1. 保存该授权方案

步骤3:给目标页面设置正确的授权

找到需要开放给非认证用户的页面,编辑页面属性:

  • 切换到Security标签页
  • 在Authorization Scheme下拉框中选择刚创建的Allow_Public_Only
  • 保存设置

为什么之前的设置无效?

  • 原CustomAuthorization没有处理非认证用户的查询异常,导致非认证用户访问时直接抛出错误
  • “Must Not Be Public User”的逻辑是禁止公共用户访问,和你需要的“仅允许非认证用户”完全相反,所以设置后非认证用户会被拒绝

内容的提问来源于stack exchange,提问作者Dev Yego

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 14:02:42