【IT168 技术文档】当我们配置好Poral与LDAP服务器的连接后(即:启用Portal安全性后),Portal登陆的参数是由用户名+密码的方式实现的。但是,在很多大型的企业内部,都存在用户重名的问题,在企业内部辨别用户惟一身份属性可能是员工号、邮件地址等其它LDAP服务器中的用户属性,并不是用户名。这样,如果存在用户的重名问题,将造成这部分重名用户出现无法登陆Portal的现象。为了解决这些问题,我们必须通过定制Portal Login的参数,将Login参数变为员工号+密码或者邮件地址+密码等方式,来解决用户名重名问题。
Portal系统登陆机制的介绍
首先我们先介绍一下在Portal配置好与LDAP服务器的连接后,用户的登陆过程。
第一步:用户输入用户名+密码,点击登陆按钮。

第二步:WebSphere Application Server 登陆,应用服务器基于LDAP服务器确认用户名和密码的合法性,并且建立一个信任的Token,存储此Token在客户浏览器中,为接下来的请求服务。

第三步:Portal的JAAS登陆,Portal为JAAS login建立一个上下文环境,并执行Portal JAAS login 登陆命令。这个命令将注册JAAS Login模块,并且使JAAS Login模块有了可以存储凭证到用户Session Data的可能性。

第四步:WebSphere Portal Server user login。PortalServer从用户注册表(在配置Portal安全性后,用户的属性信息通常情况下可能存储在两部分中,一部分在LDAP中,另一部分在Portal的数据库中)载入所有的重要的用户属性信息。

第五步:恢复Session。根据客户需要,恢复用户的最近一次Portal Session信息
第六步:浏览器重定向。客户端被重定向到合适的页面,例如:登陆成功到用户首页,登陆失败返回登陆页面。
门户的登出顺序:
第一步:挂起用户Session。用户的Portal Session信息被持久化,使用户再次登陆Portal的时候可以提供Session恢复的功能。
第二步:Portal 用户登出。Portlets被通知执行了用户登出事件,使Portlets有可能去终止所有运行过程中的事务。
第三步:WebSphere Application Server 登出。用户的凭证Token被标记为不无效,并且对应的Cookie也被执行相关的无效命令。
第四步:浏览器重定向到Portal的主页。
定制Portal登陆参数
大多数情况下,启用IBM WebSphere® Portal的安全性是通过如下两个命令实现的:
1. enable-security-ldap,此命令是non-realm的方式,不支持多个LDAP服务器
2. enable-security-wmmur-ldap,此命令是支持multi-realm的方式,支持多LDAP服务器。
针对以上两种启用IBM WebSphere® Portal的安全性的方式,在定制Portal登陆参数时,存在不同的配置方式,下面将分别描述。
利用以上命令配置Portal 安全性时候,系统login的属性是基于WebSphere/PortalServer/Config/wpconfig.properties文件中的“LdapUserPrefix”来定义的。
通常情况,我们可能遇到这样的问题:客户在实施了LDAP集中的项目,故而各分公司的用户数据都会定时同步至总部的LDAP目录服务器中进行统一管理,这样造成总部的LDAP目录服务器中出现相同的帐号(同名问题),例如:uid=zhang3,cn=users,o=china,dc=ibm,dc=com和uid=zhang3,cn=users,o=Taiwan,dc=ibm,dc=com,所以uid=zhang3这个属性在总部的LDAP目录服务器中不是全局唯一的,而门户服务器的登陆默认是使用uid这个属性的,我们也都知道,Portal的登陆属性,在整个LDAP服务器中是必须惟一的,这样zhang3帐号也就无法登陆Portal。为了解决这个问题,我们必须通过定制Portal Login的参数,将Login参数变为员工号+密码或者邮件地址+密码等方式,来解决uid重名问题。当然,为了实现这个改变,下列的前提条件是我们必须满足的:
• 首先我们还是推荐生产环境中使用的Portal Login属性在LDAP中应该是惟一的,至少在Portal所使用的那部分LDAP树中是惟一的,否则,会出现不可预知的结果。
• 这个Login属性应该是一个对所有用户都合适的属性,例如邮件地址,员工号等。
• 用于WebSphere global security (LdapBINDId) 和 WebSphere Member Manager (WMM) configuration (LDAPAdminUId)的 BIND user ID(s)必须能有权限访问门户系统中的LDAP所有用户的各个属性。
在我们开始介绍整个配置过程前,我们需要先了解一下Portal Login中所涉及到最重要的几个属性:Distinguish login attribute 和 the so-called Relative Distinguished Name (RDN)。
在WMM 配置文件中,"rdnAttrTypes"定义了user DN的第一部分,例如:如果用户的Full DN为"cn=John Smith, cn=Users, ou=itDept,o=Acme," 那么 WMM定义的"rdnAttrTypes" 就是 "cn."这个Login的属性通常是一个相对简单的在LDAP中的属性,通常情况下,RDN和Login 属性是相同的,但是我们也可以配置成不同。 我们推荐在Portal系统安装,配置安全性的过程中,都利用系统默认的配置,RDN和Distinguish login attribute 属性是相同的。等安装、配置完成后再单独定制Distinguish login attribute 属性。
下面我们将具体介绍定制Distinguish login 属性的具体过程。
首先:先介绍使用了enable-security-ldap 命令配置了Portal安全性后,如何定制Distinguish login 属性。
我们假设用户 login 属性被设置成“cn”,并且这个用户的 full DNs是"cn=John Smith,cn=users,ou=people,o=acme"。我们希望将用户的login属性变成“acmeid”,这个属性是LDAP服务器中辨别用户惟一性的属性。具体步骤如下:
1. 根据我们在上面描述的Portal的登陆过程,首先我们需要用户能基于Login属性登陆到WebSphere Application Server,这样我们需要在WebSphere Application Server管理控制台中更改WebSphere Application Server安全性的配置参数“userFilter”,将参数从
[<tt>(&(cn=%v)(objectclass=inetOrgPerson)))</tt>]
改成
[<tt>(&(acmeid=%v)(objectclass=inetOrgPerson)))</tt>]
并且 userIdMap 参数也需要从
[<tt>*:cn</tt>]
更改成
[<tt>*:acmeid</tt>]
2. 下一步我们需要更改其它安全相关的属性文件:
(a) userSecurityNameAttribute 在 wmm.xml 文件中,"cn" 应该改成 "acmeid"
(b) "acmeid" 属性的描述文件应该被加到 wmmAttributes.xml, 例如:
<attribute wmmAttributeName="acmeid"
applicableMemberTypes="Person"
requiredMemberTypes="Person"
dataType="String"
valueLength="254"
multiValued="false"/>
(c) 在wmmLDAPServerAttributes.xml 文件中,"acmeid" 属性还需要完成映射,例如:
<attributeMap wmmAttributeName="acmeid"
pluginAttributeName="acmeid"
applicableMemberTypes="Person"
requiredMemberTypes="Person"
dataType="String"
valueLength="256"
multiValued="false"/>
3. 最后,重新启动Portal 服务器,就可用将登陆方式改成 acmeid+密码登陆方式了。
接着:
我们介绍使用了enable-security-wmmur-ldap 命令配置了Portal安全性后,如何定制Distinguish login 属性。
因为使用enable-security-wmmur-ldap,此命令是支持multi-realm的方式,支持多LDAP服务器,此命令将定制Portal的WMMUR(即:扩充了Portal的WMM数据库,增加了更多的属性),这样,上面我们提到的userFilter、userIDMap这样的属性将不再使用,我们仅仅需要更改wmmUserSecurityNameAttr属性,将“cn”更改成“acmeid”,此属性需要在WebSphere Application Server管理控制台中的安全配置中自行添加,例如:在管理控制台中,进入如下导航连接 Security > User Registries > Custom > Custom Properties,创建新的属性 wmmUserSecurityNameAttr,Value=acmeid。
说明:
基于上面的文档,如果你选择映射“uid”到“acmeid”在wmmLDAPAttributes.xml,就不需要加"acmeid"相关的属性描述文件到 wmmAttributes.xml。在使用enable-security-ldap 命令配置了Portal安全性后,userFilter 和 userIdMap 必须被设置成 "acmeid," 但是 "uid" 仍然应在该wmm.xml文件中被使用。另外,使用enable-security-wmmur-ldap 命令配置了Portal安全性后,WebSphere Application Server的安全性配置属性(wmmUserSecurityNameAttr)和wmm.xml的userSecurityNameAttribute应被设置成“uid”。
结束语
通过以上的方案,我们可以方便的将Login参数变为员工号+密码或者邮件地址+密码等方式,来解决用户名重名问题。
关于作者
卓毓鸣, IBM 软件部的高级信息工程师。