一般来说,很少需要修改角色名。而且biee角色名不能直接修改,只能采用创建新角色然后对新角色重新授权来间接实现修改角色。
但是这样有一个问题,如果需要修改的角色很多,或者需要授权的地方很多怎么办?
这个时候就只能采用程序的方式的来修改角色名了。
由于biee从11g起就采用了OPSS来管理角色,修改角色名就被分为了两步。
第一步 修改em中的角色名
第二步 修改rpd和catalog中的角色名
第一步 修改em中的角色名
修改em中的角色名,可以采用两种方式,一种是使用wlst脚本,另一种是使用java jmx接口。本文以wlst为例,讲解相关方法。
wlst是weblogic的管理脚本,可以和jython一起使用,能完成复杂的自动化运维操作。
wlst脚本有三种调用方式,分别是交互式、离线式和嵌入式。本文以离线式为例,其他两种方式请参考
Using the WebLogic Scripting Tool
离线式比较好理解,就是用wlst解释器调用py (Jython)脚本,完成相关操作。
具体方式为:
$FMW/oracle_common/common/bin/wlst.sh
然后使用execfile调用脚本/home/biee06/appRoleRename.py
wls:/offline> execfile('/home/biee06/appRoleRename.py')
appRoleRename.py示例程序如下:
该程序会用于给所有黑名单之外的角色“添加"前缀
注:先创建新角色,然后复制角色成员,最后删除旧角色;大家可以根据自己的需要来修改下面的程序
from cStringIO import StringIO
import sys
import re
blacklist = ['BIAdministrator','BIAuthor','BIConsumer','BISystem']; #角色黑名单,不会修改黑名单中的角色
rolelist = [];
cux_prefix = 'FBUBI_' #需要添加的前缀
admin_user ='weblogic'
admin_password = 'admin123'
admin_url = 't3://localhost:8701'
def createRole( roleName ):
"创建角色"
createAppRole(appStripe="obi", appRoleName= roleName)
print "角色",roleName,"创建成功"
return;
def deleteRole( roleName ):
"删除角色"
deleteAppRole(appStripe="obi", appRoleName=roleName) ;
print "删除角色",roleName,"成功"
return;
def deleteRoleStartWith( startWith ):
"删除以startWith开头的角色"
listRoles()
tmpList = rolelist[:];
for r in tmpList:
if r.startswith(startWith):
deleteAppRole(appStripe="obi", appRoleName=r) ;
print "删除角色",r,"成功"
return;
def addMembers( roleName,memberDict):
"添加成员"
grantAppRole(appStripe="obi", appRoleName=roleName, principalClass=memberDict['principalClass'], principalName=memberDict['principalName'], forceValidate="false")
print "成员",memberDict['Type'],memberDict['principalName'],"添加成功"
return;
def getMembers( roleName ):
"获取角色成员列表"
oldstdout = sys.stdout
sys.stdout = mystdout = StringIO()
listAppRoleMembers(appStripe="obi",appRoleName= roleName);
sys.stdout = oldstdout
app_roles=mystdout.getvalue()
allLines = app_roles.strip().splitlines()
members=[];
for line in allLines:
matchObj=re.search('Principal Clz Name : ([^,]+), Principal Name : (\w+), Type : (\w+)',line)
if matchObj:
d = {'principalClass': '', 'principalName': ''};
d['principalClass'] = matchObj.group(1)
d['principalName'] = matchObj.group(2)
d['Type'] = matchObj.group(3)
members.append(d)
else:
print "角色[",roleName,"]没有成员"
return members
def listRoles():
"获取角色列表"
oldstdout = sys.stdout
sys.stdout = mystdout = StringIO()
listAppRoles(appStripe="obi")
sys.stdout = oldstdout
app_roles=mystdout.getvalue()
allLines = app_roles.strip().splitlines()
for line in allLines:
matchObj=re.search('Principal Name : (\w+)',line)
if matchObj:
roleName = matchObj.group(1)
if roleName in blacklist:
continue
else:
rolelist.append(roleName)
else:
print "No match!!"
return;
print 'Connecting...'
#======================main=========================================
try:
connect(admin_user, admin_password, admin_url)
except:
print "Error while trying to connect server, please make sure server is running."
print "====遍历角色======="
listRoles()
if len(rolelist) > 0 :
print "一共找到",len(rolelist),"个角色"
print "====开始创建角色======="
for role in rolelist:
createRole(cux_prefix+role)
print "=====开始添加成员======="
for role in rolelist:
members=getMembers( role )
for member in members:
if member['Type'] == 'APP_ROLE':
member['principalName'] = cux_prefix+member['principalName']
addMembers(cux_prefix+role,member)
print "=========删除旧角色============="
for role in rolelist:
deleteRole(role)
print "=======操作结束========="
disconnect()
除了执行wlst.sh之外,还可以直接使用java weblogic.WLST
appRoleRename.py的方式来调用脚本。但在执行java weblogic.WLST之前需要先设置好CLASSPATH和PATH环境变量。
方法是直接加载如下脚本来完成相关变量的设置:
source $FMW/Oracle_Home/wlserver/server/bin/setWLSEnv.sh
第二步 修改rpd和catalog中的角色名
可以使用datamodel.sh renameapproles来修改rpd和catalog中的角色名
语法如下:
./datamodel.sh renameapproles -h
usage: renameapproles -T <approlenamelist.json> [-L <plugin list>] -U <cred user> [-P <cred password>] [-SI <service instance>] [-S <host>] [-N <port>] [-SSL]
其中approlenamelist.json是一个json格式的文本,需要我们自己编写,例如
{
"Title":"Target Application Roles",
"App-Roles":[
{ "oldname":"app1", "newname":"bi_app1" },
{ "oldname":"app2", "newname":"bi_app2" }
]
}
调用示例:
cd $fmw/user_projects/domains/bi/bitools/bin
./datamodel.sh renameapproles -T approlenamelist.json -U weblogic -P admin123 -SI ssi
最后记得重启一下整个biee,以便让修改生效。