你的位置:首页 > Java教程

[Java教程]cas 4.X单点登录实战


使用工具

maven-3.3.9

cas-4.1.4

Tomcat-7.0.57-win-x64

cas-sample-java-webapp

一、Hello cas

1、下载Tomcat,解压;修改其server.

1 <Connector SSLEnabled="true" acceptCount="100" clientAuth="false"2 disableUploadTimeout="true" enableLookups="false" maxThreads="25"3 port="8443" keystoreFile="G:/work/xxx/tomcat.keystore" keystorePass="YOUR PASSWORD HERE"4 protocol="org.apache.coyote.http11.Http11NioProtocol" scheme="https"5 secure="true" sslProtocol="TLS" />

 

1、从https://github.com/Jasig/cas/releases 下载cas-server对应的版本;

2、解压,使用maven命令mvn package对cas进行编译打包,这里可能会出现2个问题:

  a.单元测试不通过==》尝试加上-Dmaven.test.skip=true跳过;

  b.编译到一半编译不过==》进入cas-server-core,执行命令mvn install -Dmaven.test.skip=true先将core编译为jar包后,再进行。

3、将打包好的cas-server-webapp下的war包复制到tomcat下,运行tomcat先试试吧;

4、使用账号casuser,密码Mellon登录,成功

5、从https://github.com/Jasig/java-cas-client 下载java-cas-client,如上步骤解压编译,编译后不再操作,待用。

6、从https://github.com/UniconLabs/cas-sample-java-webapp 下载cas-sample-java-webapp,如上步骤解压编译,编译后不再操作,待用。

 

二、server配置数据库连接认证

   上面我们采用的是默认配置,登录账号实际上是在cas/WEB-INF/deployerConfigContext.

1、回到我们刚刚maven编译的cas目录下,将cas-server-support-jdbc/target/cas-server-support-jdbc-4.1.4.jar 复制到tomcat/webapp/cas/WEB-INF/lib下,再复制mysql-connector-java-5.0.8-bin.jar到tomcat/webapp/cas/WEB-INF/lib下。当然这些你可以在cas-server-webapp下的pom.

2、修改cas/WEB-INF/deployerConfigContext.

1 <bean id="primaryAuthenticationHandler"2      class="org.jasig.cas.authentication.AcceptUsersAuthenticationHandler">3    <property name="users">4      <map>5        <entry key="casuser" value="Mellon"/>6      </map>7    </property>8 </bean>

注释以上代码,增加如下代码

 1   <bean id="dataSource" 2     class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 3     <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 4     <property name="url" 5       value="jdbc:mysql://10.3.64.87:3306/cas?characterEncoding=utf-8&amp;autoReconnect=true" /> 6     <property name="username" value="root" /> 7     <property name="password" value="123456" /> 8   </bean> 9   10   <bean id="primaryAuthenticationHandler"11      class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"12      p:dataSource-ref="dataSource"13      p:passwordEncoder-ref="MD5PasswordEncoder"14      p:sql="select password from user_info where user_name=?" />15      16   <bean id="MD5PasswordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">17     <constructor-arg index="0">18       <value>MD5</value>19     </constructor-arg>20   </bean>

这里我们增加了MySQL的数据连接dataSource,并编写了SQL查询用户认证信息。

修改完成,我们来测试一下能否通过MySQL进行认证。启动tomcat。

 

 登录成功,我们已经成功和MYSQL连接成功了。

三、添加客户端

  这里我们将用到第一步里面待用的cas-sample-java-webapp。

1、将编译好的cas-sample-java-webapp/target/cas-sample-java-webapp.war部署到tomcat下;

2、找到tomcat/webapp/cas-sample-java-webapp/WEB-INF/web.

 1      <init-param> 2       <param-name>redirectAfterValidation</param-name> 3       <param-value>true</param-value> 4     </init-param> 5     <init-param> 6       <param-name>useSession</param-name> 7       <param-value>true</param-value> 8     </init-param> 9     <init-param>10       <param-name>acceptAnyProxy</param-name>11       <param-value>true</param-value>12     </init-param>13     <init-param>14       <param-name>proxyReceptorUrl</param-name>15       <param-value>/client/proxyUrl</param-value>16     </init-param>17     <init-param>18       <param-name>proxyCallbackUrl</param-name>19       <param-value>https://zhuajindian.com:8443/client/proxyUrl</param-value>20     </init-param>

 

将其中的多个casServerUrlPrefix、serverName、casServerLoginUrl替换成你自己的URL。

3、修改deployerConfigContext.

1   <bean id="serviceRegistryDao" class="org.jasig.cas.services.JsonServiceRegistryDao"2      c:configDirectory="${service.registry.config.location:classpath:services}" />

替换为

1   <!-- 注册服务 -->2   <bean id="serviceRegistryDao" class="org.jasig.cas.services.InMemoryServiceRegistryDaoImpl"3       p:registeredServices-ref="registeredServicesList" />4 5   <util:list id="registeredServicesList">6     <bean class="org.jasig.cas.services.RegexRegisteredService"7        p:id="0" p:name="HTTP and IMAP" p:description="Allows HTTP(S) and IMAP(S) protocols"8        p:serviceId="^(https?|http?|imaps?)://.*" p:evaluationOrder="10000001" />9   </util:list>

这里的serviceId就是你告诉cas服务器端,通过这个正则来判断,符合这个正则表达式的,就是我们自己的客户端。当然这里泛匹配了,你可以根据实际情况来。

4、重启tomcat,访问刚刚填写在serverName处的URL试试

可以看到,我们已经能够成功获取到Authenticated UserId,也就是登录的用户名。这样,我们的简单demo就完成了。

四、自定义登录后的可传递字段,方便客户端读取

  在我们的应用场景中,客户端需要的参数不仅仅是用户名。还需要诸如userid等各类信息,那么,接下来我们就来配置获取自定义字段。

1、找到cas/WEB-INF/deployerConfigContext.

 1   <bean id="attributeRepository" class="org.jasig.services.persondir.support.NamedStubPersonAttributeDao" 2      p:backingMap-ref="attrRepoBackingMap" /> 3  4   <util:map id="attrRepoBackingMap"> 5     <entry key="uid" value="uid" /> 6     <entry key="eduPersonAffiliation" value="eduPersonAffiliation" /> 7     <entry key="groupMembership" value="groupMembership" /> 8     <entry> 9       <key><value>memberOf</value></key>10       <list>11         <value>faculty</value>12         <value>staff</value>13         <value>org</value>14       </list>15     </entry>16   </util:map>

替换为:

 1   <bean id="attributeRepository" class="org.jasig.services.persondir.support.jdbc.SingleRowJdbcPersonAttributeDao"> 2     <constructor-arg index="0" ref="dataSource" /> 3     <constructor-arg index="1" value="SELECT id,user_name,mobile,cid FROM user_info WHERE {0}" /> 4       <property name="queryAttributeMapping"> 5         <map> 6           <entry key="username" value="user_name" /> 7         </map> 8       </property> 9       <property name="resultAttributeMapping">10         <map>11           <entry key="id" value="userId" />12           <entry key="user_name" value="username" />13           <entry key="mobile" value="mobile" />14           <entry key="cid" value="cid" />15         </map>16       </property>17   </bean>

其中的sql只需要写前半部分,如示例,entry的key代表上面sql查询的字段,value代表服务端传给客户端的参数名,客户端可以通过value取出对应的值。

2、修改cas/WEB-INF/view/jsp/protocol/2.0/casServiceValidationSuccess.jsp,增加下面这段

 1 <cas:serviceResponse ='http://www.yale.edu/tp/cas'> 2   <cas:authenticationSuccess> 3     <cas:user>${fn:escape</cas:user> 4     <!-- 这段 --> 5     <c:if test="${fn:length(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes) > 0}"> 6       <cas:attributes> 7         <c:forEach var="attr" items="${assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes}"> 8           <cas:${fn:escape>${fn:escape</cas:${fn:escape> 9         </c:forEach>10       </cas:attributes>11     </c:if>12     <!-- 这段 end-->13     <c:if test="${not empty pgtIou}">14       <cas:proxyGrantingTicket>${pgtIou}</cas:proxyGrantingTicket>15     </c:if>16     <c:if test="${fn:length(chainedAuthentications) > 0}">17       <cas:proxies>18         <c:forEach var="proxy" items="${chainedAuthentications}" varStatus="loopStatus" begin="0" end="${fn:length(chainedAuthentications)}" step="1">19           <cas:proxy>${fn:escape</cas:proxy>20         </c:forEach>21       </cas:proxies>22     </c:if>23   </cas:authenticationSuccess>24 </cas:serviceResponse>

3、重启tomcat,登录看效果:

上面配置的4个参数这里显示了3个,原来mobile字段是因为没有值,所以他默认就不传递了。