| |||
|
作者:Gaurav Singh
定制 Oracle Identity Manager 用户界面的提示、技巧和技术洞察
2014 年 2 月
定制 Oracle Identity Manager (OIM) 自助控制台(“ID Console”)满足了一些业务需求,包括:
在本文中,我们将了解有关 OIM(协同一些其他组件)如何在 UI 上实现这种灵活性的一些幕后细节。本文假设读者熟悉 OIM 的基本功能,了解各种应用开发框架构件,如 EO.xml、VO.xml、pageDef.xml、tf.xml、.jsff 文件和托管 bean (mBean)。本文适用于 OIM 11gR2 及更高版本。
Oracle Metadata Services (MDS) 通过 XML 文件提供可安全升级的定制框架。我们来看看以下示例,了解其含义:
假设一个应用提供以下 OOTB XML 文档,其路径 /metadata/sample-app-metadata.xml
由 MDS 管理。
<BaseDocument id="base"> <TagA id="tagA" name="Sample Tag A" prop="30" /> <TagB id="tagB" name="Sample Tag B" prop="25" /> <TagC id="tagC" name="Sample Tag C" prop="10" /> </BaseDocument>
现在,如果该应用保证此 XML 可在运行时定制,它将为此提供两个字符串。定制层名称(对于 OIM 为“site”)和层值(同样对于 OIM 为“site”)。使用这种办法,可在目录 /metadata/mdssys/cust/<layer-name>/<layer-value>/sample-app-metadata.xml.xml
(注意扩展名“.xml.xml
”)中创建一个定制 XML 文件,如下所示:
<mds:customization version="11.1.1.61.15" xmlns:mds="http://xmlns.oracle.com/mds"> <mds:modify element="tagB"> <!-MODIFYING PROP OF TAG-B TO 15 --> <mds:attribute name="prop" value="15"/> </mds:modify> <mds:insert parent="base" position="first"> <!-INSERTING A CUSTOM ELEMENT AT THE BEGINNING OF ROOT TAG --> <Tag0 id="tag0" name="Custom Tag 0" prop="35" /> </mds:insert> </mds:customization>
在运行时,如果应用现在请求 sample-app-metadata.xml
,以下 XML 将生效(定制更改以粗体显示):
<BaseDocument id="base?> <Tag0 id="tag0" name="Custom Tag 0" prop="35" /> <TagA id="tagA" name="Sample Tag A" prop="30" /> <TagB id="tagB" name="Sample Tag B" prop="15" /> <TagC id="tagC" name="Sample Tag C" prop="10" /> </BaseDocument>
现在,由于定制 XML 独立存在,升级到下一版本时替换基础文档不会影响定制。它是可以安全升级的。
OIM 使用此概念以及 MDS 中的沙箱进行 UI 定制。我们来看一个典型用例:为用户实体添加了一个定制属性,并将其拖放到创建和查看用户页面上。我们将同时看到生成的构件及其含义。
/mdsys/sandbox/active_mdsSandboxMetadata.xml
:该文件标识一个沙箱 zip。它包含沙箱名称、创建者、上次修改者及各自的时间戳。如果您要用某个其他名称导入同一沙箱,更改 zip 文件名称也无济于事。应在此文件中更改名称。OIM 创建的沙箱名称前缀为“IdM”,更改名称时不得删除。oracle/iam/ui/common/model/user/entity[或 view]/mdssys/cust/site/site/userEO[或 VO].xml.xml
:有两个基于 userEO/VO.xml
的定制 XML 文件。它们包含新添加属性的定义。稍后再介绍它们。oracle/iam/ui/runtime/form/model/user/entity[或 view]/mdssys/cust/site/site/userEO[或 VO].xml.xml
:这些基于 userEO/VO.xml
的定制 XML 文件只存在于用户创建和用户修改流程中。由于用户创建/修改根据当前用户授权采取直接或审批路线,这两个流程在后台与透明处理此问题的目录集成。EO/VO.xml
文件,因为它们也与目录集成(虽然不是以透明方式)。xliffBundles/oracle/iam/ui/runtime/BizEditorBundle_en_US.xlf
:这是个资源包文件,其中保存属性的显示标签供本地化使用。默认情况下,生成该文件时使用在其下创建属性的浏览器区域设置的区域设置后缀。因此,例如在创建属性时,如果标签为法语,但浏览器区域设置为英语,则该标签将用于区域设置为英语的浏览器。userEO.xml.xml
文件的示例。<?xml version='1.0' encoding='UTF-8'?> <mds:customization version="11.1.1.64.93" xmlns:mds="http://xmlns.oracle.com/mds" motype_local_name="PDefEntityObject" motype_nsuri="http://xmlns.oracle.com/bc4j"> <!-- INSERT STATEMENT TO BE EXECUTED OVER OOTB USEREO.XML FILE--> <mds:insert parent="UserEO" position="last"> <!-- EO.XML ENTRY FOR ATTRIBUTE. NOTE THAT NAME IS ppNumber__c. --> <Attribute Name="ppNumber__c" IsPersistent="false" Precision="60" Scale="0" ColumnName="PPNUMBER__C" Type="java.lang.String" ColumnType="VARCHAR2(255)" SQLType="VARCHAR" xmlns="http://xmlns.oracle.com/bc4j"> <Properties> <!-- CERTAIN PROPERTIES OF ATTRIBUTE --> <Property Name="AttributeType" Value="Text"/> <Property Name="DISPLAYWIDTH" Value="60"/> <Property Name="ExtnCustom" Value="Y"/> <!-- REFERENCE TO BizEditorBundle.xlf FOR DISPLAY LABEL (CONTAINED IN THE SAME SANDBOX) --> <Property Name="LABEL_ResId" Value="${adfBundle['oracle.adf.businesseditor.model.util.BaseRuntimeResourceBundle'] ['oracle.iam.ui.common.model.user.entity.UserEO.ppNumber__c_LABEL']}"/> <!-- NAME OF ATTRIBUTE AS KNOWN BY OIM BACKEND --> <Property Name="oimRefAttrName" Value="ppNumber"/> </Properties> <CompOper Name="=" ToDo="2" Oper="=" MinCardinality="1" MaxCardinality="1"/> <CompOper Name="STARTSWITH" ToDo="2" Oper="STARTSWITH" MinCardinality="1" MaxCardinality="1"/> <CompOper Name="ENDSWITH" ToDo="2" Oper="ENDSWITH" MinCardinality="1" MaxCardinality="1"/> <CompOper Name="<>" ToDo="2" Oper="<>" MinCardinality="1" MaxCardinality="1"/> <CompOper Name="CONTAINS" ToDo="2" Oper="CONTAINS" MinCardinality="1" MaxCardinality="1"/> <CompOper Name="DOESNOTCONTAIN" ToDo="2" Oper="DOESNOTCONTAIN" MinCardinality="1" MaxCardinality="1"/> <CompOper Name="Dummy" ToDo="-2" Oper="Dummy" MinCardinality="1" MaxCardinality="1"/> </Attribute> </mds:insert> <mds:modify element="UserEO"> <mds:attribute name="StaticDef" value="oracle.iam.ui.common.model.user.entity.UserEO"/> </mds:modify> </mds:customization>
.jsff
文件中添加一个 <af:inputText>
组件,并将其绑定到 ADF BC 层中的特定属性。此绑定应通过 pageDef.xml
的 <attribute>
绑定完成。我们来导出沙箱并验证其实际内容如下所示。userCreateForm.jsff.xml
userCreateFormPageDef.xml.xml
我们来看看 OIM 通过 MDS 定制 UI 时使用的一些组件。
ADFContext.getCurrent.getMDSSessionAsObject(
) 方法获取。)EO.xml
、VO.xml
和 AM.xml
)。为用户/角色/组织创建定制属性时,BE 负责基于包含新属性的对应 EO/VO 生成定制 XML 文件。同样,这些文件被推送到当前 ADF 上下文的 MDS 会话,由 MDS 的管理。BE 也在创建应用实例表单时发挥作用。在本例中,在运行时创建一个新的 EO.xml
和 VO.xml
,并编辑 OOTB CatalogAM.xml
以包含新的 VO。除了基于 MDS 的定制框架,OIM 还提供了一种构建定制 ADF 任务流和托管 bean 的方法。这些通常用于定制验证、处理定制链接和按钮操作,甚至构建全新的屏幕和通过某些链接启动它们。下面是此类更改的部署过程:
IDM_HOME/server/jdev.lib
目录中找到。WEB-INF/lib
文件夹中的 oracle.iam.ui.custom-dev-starter-pack.war
(文件位于 IDM_HOME/server/apps
中)。如果 WEB-INF
中没有 OOTB,则创建一个 lib 文件夹。oracle.iam.ui.custom
库,查看部署路径(可能不是从 IDM_HOME/server/apps
部署的)。oracle.iam.ui.custom
库oracle.iam.ui.custom
库部署。一旦更新完成,就启动先前停止的两个应用。开发定制 mBean 时必须牢记几点:
adfc-config.xml
中直接注册 bean 时,不要使用 pageFlowScope
或 backingBeanScope
。而是使用会话和请求作用域。如果您构建了自己的任务流,那么可以在此使用任何所需作用域注册 bean。本文对通过 OIM UI 可能实现的定制进行了技术分析,演示了最常见的用例 — 为创建和查看详细信息页面添加新用户属性 — 并介绍了后台发生的一些事情。本文还介绍了注入在运行时可用的 OIM UI 定制 ADF 代码的所须执行的基本步骤。
Gaurav Singh 是 Oracle Identity Manager 开发小组成员。自其职业生涯伊始,他就一直关注 UI 技术,研究了 Oracle ADF、Oracle Metadata Services、Oracle Composer 及类似工具,以提供下一代用户界面。