zjuwangleicn 2011-03-06
紧接上一篇CAS配置第一步:准备工作
CASJava群35271653
1:加入数据库验证
再将cas.war部署到tomcat-cas-server下之后,
将oracle数据库驱动加入到cas工程的lib下
打开目录X:\tomcat-cas-server\webapps\cas\WEB-INF下的deployerConfigContext.xml修改里面的内容,注释掉以下代码:
<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler"
这段代码CAS默认的验证方式,就是用户名和密码相同即可通过认证,我们现在做的时候加入数据库验证,就是用户名密码来自数据库。
在相同的位置上加入如下代码:
<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"> <property name="sql" value="select pwd from portal_user where id=? and sessionid is null" /> <property name="dataSource" ref="dataSource" /> </bean>
其中,sql语句可以自定义成你想要的结果,例如:
select password from tablename where username=?
然后在根节点<beans>下加入节点如下:
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"> <value>oracle.jdbc.driver.OracleDriver</value> </property> <property name="url"> <value>jdbc:oracle:thin:@xxxxxxxxxxxxx:1521:pisdb</value> </property> <property name="username"> <value>pis</value> </property> <property name="password"> <value>pis</value> </property> </bean>
里面的参数配置,XML诠释的非常清楚,不再解释。
2:让CAS返回更多用户信息XML修改
然后找到serviceRegistryDao这个节点,将里面的内容全部注释掉:
<bean id="serviceRegistryDao" class="org.jasig.cas.services.InMemoryServiceRegistryDaoImpl"> <!--<property name="registeredServices"> <list> <bean class="org.jasig.cas.services.RegisteredServiceImpl"> <property name="id" value="0" /> <property name="name" value="HTTP" /> <property name="description" value="Only Allows HTTP Urls" /> <property name="serviceId" value="http://**" /> </bean> <bean class="org.jasig.cas.services.RegisteredServiceImpl"> <property name="id" value="1" /> <property name="name" value="HTTPS" /> <property name="description" value="Only Allows HTTPS Urls" /> <property name="serviceId" value="https://**" /> </bean> <bean class="org.jasig.cas.services.RegisteredServiceImpl"> <property name="id" value="2" /> <property name="name" value="IMAPS" /> <property name="description" value="Only Allows HTTPS Urls" /> <property name="serviceId" value="imaps://**" /> </bean> <bean class="org.jasig.cas.services.RegisteredServiceImpl"> <property name="id" value="3" /> <property name="name" value="IMAP" /> <property name="description" value="Only Allows IMAP Urls" /> <property name="serviceId" value="imap://**" /> </bean> </list> </property>--> </bean>
此节点的作用为:如果你在<list>中加入了bean,并设定了serviceId的value,那么通过CAS你只能访问这个url地址,其他的url地址将不能访问,**代表的意思就是指该协议下所有的都允许被访问。但是在实际操作中,加入如果不注释掉里面的内容,将会在客户端无法获取到用户更多的登录信息。
然后在配置文件的根节点(<beans>)下加入以下XML配置:
<bean id="attributeRepository" class="org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao"> <constructor-arg index="0" ref="dataSource"/> <constructor-arg index="1" value="select * from portal_user where {0}" /> <property name="queryAttributeMapping"> <map> <entry key="username" value="id" /> </map> </property> <property name="resultAttributeMapping"> <map> <entry key="id" value="UserId"/> <entry key="sessionid" value="UserName"/> <entry key="uclass" value="UserClass"/> </map> </property> </bean>
其中的sql语句可以根据自己的情况来写。下面resultAttributeMapping中的参数解释如下:
<entrykey="id"value="UserId"/>
key代表的是你数据库中的字段,Value是客户端通过AttributePrincipal获取时的参数
3:CAS登录获取更多用户信息的JSP修改
仅仅是修改xml是不够的,你必须修改他的casServiceValidationSuccess.jsp,路径为:
X:\tomcat-cas-server\webapps\cas\WEB-INF\view\jsp\protocol\2.0
在其中紧接着加入以下代码:
<c:if test="${fn:length(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes) > 0}"> <cas:attributes> <c:forEach var="attr" items="${assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes}"> <cas:attribute> <cas:${fn:escapeXml(attr.key)}>${fn:escapeXml(attr.value)}</cas:${fn:escapeXml(attr.key)}> </cas:attribute> </c:forEach> </cas:attributes> </c:if>
注意:
1.在casServiceValidationSuccess.jsp中加入我们的代码的时候
<cas:${fn:escapeXml(attr.key)}>${fn:escapeXml(attr.value)}</cas:${fn:escapeXml(attr.key)}>
这里千万不能有空格!
2.在attributeRepository这个节点中,resultAttributeMapping下的配置,例如<entrykey="id"value="UserId"/>在配置的时候需要注意数据库中存放的不能是中文(不过理论上可以解决,具体原因就是casServiceValidationSuccess.jsp在拼接XML的时候出现乱码。)有兴趣的可以尝试解决一下。