2012年5月20日星期日

ADF_126:使用数据库作为Policy Store

开发环境:JDeveloper 11.1.1.5 + RCU 11.1.1.5 + WebLogic 10.3.5 + Application Development Runtime 11.1.1.5。

Security Policy设计时是保存在jazn-data.xml文件中的,运行时则是保存在system-jazn-data.xml文件中。
在测试和生产环境中,保存在文件中的Policy显然在性能和扩展性(比如集群)方面无法满足要求。
Oracle目前提供了三种保存Policy的方式:文件、OID(Oracle Internet Directory)和Oracle Database。
考虑到大多数用户没有使用OID,这里介绍如何使用Oracle Database作为Policy Store。

重要步骤说明:

1. 备份文件:boot.properties、jps-config.xml和system-jazn-data.xml
有关安全方面的操作一不小心就可能导致服务器无法启动,所以要首先备份。
boot.properties位于[domain_name]\servers\AdminServer\security目录下。
jps-config.xml和system-jazn-data.xml位于[domain_name]\config\fmwconfig目录下。

2. 使用RCU创建OPSS Schema
选中Oracle Platform Security Services,注意Metadata Services会被自动选中。

其它步骤请参考《创建基于数据库的MDS》。

3. 使用WLS Console为OPSS Schema创建Data Source
注意,Data Source的类型必须为Non-XA Driver且不支持Global Transaction。
不过,我这里使用的Oracle XE 10gR2,选择默认的XA Driver,经过实验,发现是可以的。
但是不保证其它版本的Oracle 数据库也可以。

其它重要配置参数如下:
JNDI name: jdbc/OPSS_DS。
user name/password: SZ_OPSS/welcome1。

4. 使用EM Console更改Security Policy Provider
(1)右键[domain_name],选择Security,选择Security Provider Configuration

(2)发现目前的Policy Store、Credntial Store、Keystore都是基于文件保存的:

(3)点击“Change Store Type",选择Database,配置如下:
Data Source JNDI Name: jdbc/OPSS_DS
Root DN: cn=SecurityStore,这个是随便给的,无需事先创建。
Create New Domain: 勾上,这里不是要创建一个Domain,其含义是创建一个新的Policy Store树节点。因为是第一次移植Policy,所以要选中。
Domain Name: adf_domain,这个不一定你创建的Domain的名称,可以是个逻辑名称。

点击OK后,开始移植Policy到数据库中,如果成功会显示下图:

重新查看Domain的Security Provider Configuration,发现已经改成Oracle Database类型了:


5. 查看SZ_OPSS Schema的表结构和数据
发现SZ_OPSS Schema名下有很多表,非常复杂,大概看了一下,发现JPS_DN表中保存了Application Roles数据:


6. 使用WLST增加/修改Policy
如果将来需要增加/修改一些Policy,可以使用WLST脚本。
wlst命令位于[fmw_home]\wlserver_10.3\common\bin目录下。
注意,实际实验中,发现在[fmw_home]\wlserver_10.3\common\bin目录下无法找到reassociateSecurityStore,报告如下错误:NameError: NameError: reassociateSecurityStore。
分析之后,发现是因为reassociateSecurityStore不在默认安装的WLS中,而是在安装了SOA的库中。
于是切换到[soa_home]\common\bin目录下,我这里是C:\Oracle\Middleware\Oracle_SOA1\common\bin。
(1)运行wlst
(2)连接到WebLogic Server:connect('weblogic', 'welcome1', 't3://localhost:7001')
(3)重新关联SecurityStore: reassociateSecurityStore(domain='adf_domain', servertype='DB_ORACLE', datasourcename='jdbc/OPSS_DS', jpsroot='cn=SecurityStore', join='false')
如果是新建的SecurityStore,join='false';如果是关联到已有的SecurityStore,join='true'。
之所以有join='true'这种情况,是考虑到一个Policy Store可能为多个Domain(包括Domain上部署的应用)服务。


注意,system-jazn-data.xml此时虽然没有用了,但是建议不要删除,因为有可能你还需要把Policy移植回来。

参考文献:
1. http://fusionsecurity.blogspot.com/2011/10/reassociation-business.html
2. http://redstack.wordpress.com/2011/10/29/soa11g-database-as-a-policy-store/
3. http://ofmcorner.blogspot.com/2010/02/using-wlst-with-oracle-fusion.html

没有评论: