在项目中,有时会用到webSphere Application Server的IBM中间组件,进行用户访问控制等操作,比如IBM的一个产品:IBM Tivoli Identity Manager, 简称 TIM, 是IBM身份的生命周期的管理工具。
我在一个项目中,TIM作为下游系统,需要连接TIM,将数据推送到TIM中,进行数据集成统一,所以需要与TIM进行二次开发有两种方式:
1、集成TIM的jar-api进行开发
2、调用TIM的webservice进行开发
不管哪种方式都会牵涉到TIM的数据操作。
我就遇到了如下问题:
com.ibm.itim.apps.exception.AppProcessingException: CTGIMS009E You do not have the authority to perform this operation.
经过了两天的排查,终于找到了原因:
原因是:对TIM的Person对象进行修改时,修改到了某个时间属性,这个时间属性值得格式不对。
排错过程:
1、找到下游TIM程序的日志文件:
可以采用命令:find / -name “trace.log”
查看:```
ITIMDev2
CTGIM
com.ibm.itim.apps.ejb.organization
server1
2、我在想是不是登录TIM的账号没有管理员的权限呢,不能进行增删改操作,就用这个账号登录到TIM的控制台随意修改了一个测试账号,发现可以修改,排除这个原因
3、那有没有可能是某个属性没有修改权限呢,可以要怎么看有没有权限呢,google一下,上面说可以通过修改日志级别来查看属性权限 http://www-01.ibm.com/support/docview.wss?uid=swg21384050
还说了有可能是:当供应策略授权参数中包含日期字段,且窗体上显示的日期与从供应策略参数中检索到的日期不同时,将发生此异常 ftp://129.35.224.19/ecc/sar/CMA/TIA/00v3l/0/5.0.0.9-TIV-TIM-FP0009.README
Symptom: The exception “CTGIMS009E: You do not have the authority to perform this operation” may occur when end users request accounts for themselves via the SSUI. This exception occurs when a date field is included in Provisioning Policy entitlement parameters and if the date displayed on the form differs from the date retrieved from the provisioning policy parameters.
4、打开TIM最高的日志级别:
找到TIM服务器上的enRoleLogging.properties文件
加入:
logger.trace.com.ibm.itim.authorization.level=DEBUG_MAX
logger.trace.com.ibm.itim.apps.ejb.account.level=DEBUG_MAX
logger.trace.com.ibm.itim.apps.ejb.organization.level=DEBUG_MAX
每十分钟刷新下配置,或是重启tim(建议等上几分钟,毕竟TIM不是自己产品)。
可以看到每个属性的权限:
<Trace Level="MAX">
<Time Millis="1533720361496"> 2018.08.08 17:26:01.496+08:00</Time>
<Server Format="IP">ITIMDev2</Server>
<ProductId>CTGIM</ProductId>
<Component>com.ibm.itim.authorization</Component>
<ProductInstance>server1</ProductInstance>
<LogText><![CDATA[Permissions granted {octsobid=rw, street=rw, erlastoperation=rw, octorgorder=rw, persontype=rw, octiamid=rw, departmentnumber=rw, octentrytime=rw, teletexterminalidentifier=rw, userid=rw, erroles=rw, registeredaddress=rw, photo=rw, postalcode=rw, octcomid=rw, x121address=rw, octgmlevel=rw, erlocale=rw, homepostaladdress=rw, displayname=rw, telephonenumber=rw, octorgname=rw, uid=rw, physicaldeliveryofficename=rw, title=rw, sn=rw, octpersonpinyin=rw, st=rw, octpid=rw, octpopertime=rw, cn=rw, l=rw, o=rw, employeenumber=rw, octinputtime=rw, octjobid=rw, facsimiletelephonenumber=rw, ersharedsecret=rw, givenname=rw, internationalisdnnumber=rw, octstafforder=rw, octapp001=rw, octapp002=rw, octapp003=rw, octapp004=rw, octapp005=rw, octplurid=rw, octapp006=rw, preferreddeliverymethod=rw, octapp007=rw, octapp008=rw, octapp009=rw, octbirthday=rw, eruri=rw, mobile=rw, ercustomdisplay=rw, octjobname=rw, manager=rw, octapp010=rw, initials=rw, octapp011=rw, octapp012=rw, eraliases=rw, octapp013=rw, octstaffstatus=rw, octapp014=rw, octapp015=rw, octmainid=rw, octapp016=rw, octapp017=rw, octapp018=rw, mail=rw, x500uniqueidentifier=rw, octapp019=rw, secretary=rw, businesscategory=rw, destinationindicator=rw, octorgshortname=rw, pager=rw, erroleassignments=rw, issync=rw, octstaffnum=rw, postaladdress=rw, jpegphoto=rw, octapp020=rw, octapp021=rw, octapp022=rw, octapp023=rw, octapp024=rw, octapp025=rw, octapp026=rw, octapp027=rw, ersupervisor=rw, audio=rw, telexnumber=rw, preferredlanguage=rw, erimageuri=rw, octorgid=rw, octgender=rw, roomnumber=rw, octleavetime=rw, octplurorgid=rw, ou=rw, employeetype=rw, carlicense=rw, postofficebox=rw, homephone=rw, labeleduri=rw, octstafftype=rw, appid=rw, description=rw, octorgsoborgid=rw}]]></LogText>
<Source FileName="com.ibm.itim.authorization.DefaultAccessAuthorityStrategy" Method="getOperationsAllowedForAttributes"/>
<Thread>WebContainer : 0</Thread>
</Trace>
这样打印出来就知道哪个属性是只读权限了(r=read ,w=write)
发现这些属性都是自定义属性,没有默认属性在里面
这时就能看到我想看到的日志了:
<Trace Level="MAX">
<Time Millis="1533719878324"> 2018.08.08 17:17:58.324+08:00</Time>
<Server Format="IP">ITIMDev2</Server>
<ProductId>CTGIM</ProductId>
<Component>com.ibm.itim.apps.ejb.organization</Component>
<ProductInstance>server1</ProductInstance>
<LogText><![CDATA[The following attributes is not writable according to ACIs. Details- entity: com.ibm.itim.dataservices.model.domain.BusinessUnitEntity: erglobalid=0_0_1,ou=orgChart,erglobalid=000000000,ou=CHIXXX,dc=CHIXXX,dc=COM, targetClass: OCTemployee, attributes: {erpersonstatus=
attribute name: erpersonstatus
attribute values:
0, ercreatedate=
attribute name: ercreatedate
attribute values:
201808081717, ersynchpassword=
attribute name: ersynchpassword
attribute values:
*6*}]]></LogText>
<Source FileName="com.ibm.itim.apps.ejb.organization.PersonManagerBean" Method="checkAttributeWriteAccess"/>
<Thread>WebContainer : 17</Thread>
</Trace>```
LogText标签中会出现详细错误:The following attributes is not writable according to ACIs.Details - entity:...................
(类似这样的,忘记保存日志了)
我的原因找到了,就是由于erpersonstatus/ercreatedate/ersynchpassword属性值引起的,删了就没问题了,因为这些都是系统默认属性,没有权利更改这个属性,一旦数据有变化,这些数据会跟着变化。希望可以帮助到跟我一样遇到此类问题的人。