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