在我们的j2ee应用程序中,我们使用安全的应用程序角色。基本上,数据源使用app用户架构连接到数据库。 app用户只有创建会话权限。 数据库登录触发器将一组属性复制到本地安全上下文。 (IP地址,会话用户,客户端ID,应用程序名称)。应用程序在执行任何DML之前显式调用存储过程sec_mgr.set_role。
sec_mgr.set_role将检查本地上下文属性,授权ip,应用程序名称,并根据会话用户为此会话设置赞赏角色。
我们希望将相同的框架应用于APEX应用程序。首先,我们将配对模式更改为仅具有create session特权的app模式。然后我们把plsql代码放在应用程序构建器中调用sec_mgr.set_role - >共享组件--->编辑安全属性--->虚拟专用数据库(VPD)。
但是,我们收到错误ORA-06565:无法从存储过程中执行SET ROLE
sec_mgr.set_role被定义为调用者的权利(AUTHID CURRENT_USER)
我是否在APEX中遗漏了某些内容以使其正常工作?
由于
答案 0 :(得分:1)
这里的问题是APEX安全模型与J2EE完全不同。
APEX用户不是数据库用户,除APEX安全性定义外,无权访问数据库中的任何内容。数据库用户不是APEX用户,缺少登录APEX应用程序的权限。
运行APEX应用程序(APEX_PUBLIC_USER或ANONYMOUS)的数据库用户需要对应用程序本身使用的架构/表具有非基于角色的访问权限。由于每个页面/提交过程(有效地)是无状态的,因此每个页面视图或提交过程都试图运行“SET ROLE”,这不是必需的。
您可以阅读APEX安全流程的this discussion或this discussion,以便更好地了解正在发生的事情。
答案 1 :(得分:0)
在研究另一个Apex角色问题时遇到了这个问题--Thomas Jones-Low的回答需要一些澄清......作为顶点运行的APEX_PUBLIC_USER或ANONYMOUS,这不是在运行时控制数据库权限或设计的时间。每个Apex工作空间都映射到一个模式,与这些模式关联的权限在运行时和设计时使用 - 否则所有Apex工作区都可以无限制地访问数据库,因为它们都连接为APEX_PUBLIC_USER或ANONYMOUS。