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

Oracle APEX自定义身份验证后无需手动分配用户即可登录的实现方法

你遇到的登录拦截是因为APEX应用启用了自带的「应用访问控制」功能,该功能优先级在自定义身份验证之后,即便你的user_aut函数校验通过,系统还是会校验用户是否在内置的访问控制列表中,未在列表的用户就会弹出如下报错:
未将用户添加到应用访问控制列表时的报错信息

方案1:直接关闭应用访问控制(最简便,适合不需要用APEX内置角色权限的场景)

操作步骤:

  • 进入对应APEX应用的后台管理页,点击「共享组件」
  • 找到「安全性」分类下的「应用访问控制」
  • 取消勾选页面顶部的「启用访问控制」选项,保存更改即可。

配置完成后,登录流程只会执行你编写的自定义身份验证逻辑,只要user_aut返回TRUE就能正常登录,不需要再手动把用户添加到内置访问列表。

方案2:保留访问控制,自动同步合法用户到列表(适合需要用APEX内置角色权限体系的场景)

如果你需要使用APEX自带的访问控制做角色权限划分,不想关闭该功能,可以在你的身份验证逻辑中新增自动加用户到访问列表的逻辑,修改后的函数示例:

FUNCTION user_aut (
 p_username IN VARCHAR2, --User_Name
 p_password IN VARCHAR2 -- Password    
) RETURN BOOLEAN
AS
lc_pwd_exit VARCHAR2 (60);
BEGIN
 -- 校验用户账号密码合法性
 SELECT 'Active'
 INTO lc_pwd_exit
 FROM USER_PROFILE
 WHERE upper("user_name") = UPPER (p_username) AND password = p_password and status='Active';

 -- 校验通过后,判断用户是否已在访问控制列表中,不存在则自动添加
 APEX_ACL.ADD_USER_ROLE (
    p_application_id => :APP_ID,
    p_user_name      => p_username,
    p_role_static_id => '普通用户' -- 这里替换成你在访问控制里定义的普通用户角色静态ID
 );

 RETURN TRUE;
EXCEPTION
 WHEN NO_DATA_FOUND
 THEN
 RETURN FALSE;
 -- 如果是重复添加角色的报错,忽略即可,说明用户已经在列表里
 WHEN APEX_ACL.ROLE_ALREADY_ASSIGNED_TO_USER THEN
 RETURN TRUE;
END user_aut;

调用APEX_ACL.ADD_USER_ROLEAPI前需要确保你已经在应用访问控制中提前定义好了对应的角色。

安全优化提示

  • 你当前的代码是明文存储、比对密码,存在严重的数据泄露风险,建议调整为加盐哈希存储密码,验证时先对传入的明文密码做哈希运算,再和库中存储的哈希值比对。
  • 建议给USER_PROFILE表的upper(user_name)字段建立函数索引,优化登录校验的查询性能。

内容的提问来源于stack exchange,提问作者New User

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:36:09