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
相关产品推荐
相关产品推荐

