由于使用CAS做单点登录要集成以前的系统,现在遇到一个问题:cas认证所使用的用户表为casuser,cas集成的A系统使用的用户表是sysuserA,集成的B系统使用的用户表是sysuserB,假如小明在casuser中的用户名为123456,在系统A中用户名为xiaoming,在系统B中的用户名是1234,基于这种情况,当小明想要访问A系统,进入cas server认证中心认证输入用户名123456和密码后认证成功跳转A系统后,系统A中记录的应该是xiaoming的用户信息,同理在访问B系统时应该不需要输入用户名密码直接进入系统B,并且在系统B中应该是1234的信息。这就需要做用户映射了。
思路一:在cas集成每个系统时在该系统中做用户映射,在cas端认证成功后返回用户名,然后在该系统的用户映射表中查询对应的用户名,进而访问系统受限资源,但这样在cas中增加一个用户需要维护每个用户映射表。
思路二:在cas server端做用户映射,这样只需要维护一个映射表即可
实现前提是cas server已经改造为通过数据库验证,cas server版本:4.0.0
下面根据思路二来进行做用户映射,建立一个系统映射表,表结构如下,其中USERNAME和SYSTEM作为主键,USERNAME为单点认证的用户名,SYSTEM为cas集成的各个系统的名字,LOCALACCOUNT为系统所对应的用户名
当通过单点登录访问某个系统时,将123456所对应的各系统的用户名返回给该系统,由该系统判断123456这个用户在该系统中所对应的用户名是哪个,然后进行受限资源访问。下面记录下具体步骤
1.首先需要配置属性attributeRepository
在WEB-INF中找到deployerConfigContext.xml文件,重新改写attributeRepository的bean
<!-- 修改前
<bean id="attributeRepository" class="org.jasig.services.persondir.support.StubPersonAttributeDao"
p:backingMap-ref="attrRepoBackingMap" />
<util:map id="attrRepoBackingMap">
<entry key="uid" value="uid" />
<entry key="eduPersonAffiliation" value="eduPersonAffiliation" />
<entry key="groupMembership" value="groupMembership" />
</util:map>
-->
<!-- 用户映射 -->
<bean id="attributeRepository" class="org.jasig.services.persondir.support.jdbc.MultiRowJdbcPersonAttributeDao">
<constructor-arg index="0" ref="dataSource" />
<constructor-arg index="1" value="SELECT * FROM user_mapping WHERE {0}" /> <!-- user_mapping为映射表的表名 -->
<property name="nameValueColumnMappings">
<!-- key为映射表中第二列字段名,value为映射表第三列字段名 -->
<map>
<entry key="SYSTEM" value="LOCALACCOUNT" />
</map>
</property>
<property name="queryAttributeMapping">
<map>
<entry key="username" value="username" />
</map>
</property>
<property name="resultAttributeMapping">
<!-- key为映射表中system字段的值,value为提供给客户端获取的属性名字,系统会自动填充值 -->
<map>
<entry key="systemA" value="systemA" />
<entry key="systemB" value="systemB" />
<entry key="systemC" value="systemC" />
</map>
</property>
</bean>
<!-- 用户映射 -->
2.修改casServiceValidationSuccess.jsp
WEB-INF/view/jsp/protocol/2.0/casServiceValidationSuccess.jsp.在server验证成功后,这个页面负责生成与客户端交互的xml信息,在默认的casServiceValidationSuccess.jsp中,只包括用户名,并不提供其他的属性信息,因此需要对页面进行扩展。<!-- add -->部分为扩展部分
<%@ page session="false" contentType="application/xml; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl