码迷,mamicode.com
首页 > 其他好文 > 详细

cas 4.1.4单点登录实战

时间:2017-02-01 15:39:10      阅读:348      评论:0      收藏:0      [点我收藏+]

标签:cas   oar   filter   att   term   数据连接   title   map   str   

使用工具

maven-3.3.9

cas-4.1.4

Tomcat-7.0.57-win-x64

cas-sample-Java-webapp

一、Hello cas

1、下载Tomcat,解压;修改其server.xml,增加对SSL支持(具体百度):

 

[plain] view plain copy
 
  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.xml配置写死的。当然不符合我们大多数的实际使用场景。现在我们将其改为连接MySQL数据库验证。

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.xml进行依赖添加再进行打包编译。

2、修改cas/WEB-INF/deployerConfigContext.xml,这里需要注意修改以下地方:

[plain] view plain copy
 
  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>  


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

[plain] view plain copy
 
  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&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.xml,删除以下代码

[plain] view plain copy
 
  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.xml,找到下面的代码

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

替换为

[plain] view plain copy
 
  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.xml,注释以下代码:

 

[plain] view plain copy
 
  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>  

 

替换为:

[plain] view plain copy
 
  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,增加下面这段

 

[plain] view plain copy
 
  1. <cas:serviceResponse xmlns:cas=‘http://www.yale.edu/tp/cas‘>  
  2.     <cas:authenticationSuccess>  
  3.         <cas:user>${fn:escapeXml(principal.id)}</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:escapeXml(attr.key)}>${fn:escapeXml(attr.value)}</cas:${fn:escapeXml(attr.key)}>  
  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:escapeXml(proxy.principal.id)}</cas:proxy>  
  20.                 </c:forEach>  
  21.             </cas:proxies>  
  22.         </c:if>  
  23.     </cas:authenticationSuccess>  
  24. </cas:serviceResponse>  



 

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

技术分享

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

 

 

五、单点退出

单点登出在应用中是必不可少的,只需要在client的web.xml顶部加上以下代码即可:

 

[plain] view plain copy
 
  1. <!--该过滤器用于实现单点登出功能,可选配置。 -->  
  2. <filter>  
  3.     <filter-name>CASSingle Sign OutFilter</filter-name>  
  4.     <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>  
  5.     <init-param>  
  6.         <param-name>casServerUrlPrefix</param-name>  
  7.         <param-value>https://zhuajindian.com:8443/cas</param-value>  
  8.     </init-param>  
  9. </filter>  
  10. <filter-mapping>  
  11.     <filter-name>CASSingle Sign OutFilter</filter-name>  
  12.     <url-pattern>/*</url-pattern>  
  13. </filter-mapping>  
  14. ;!--用于单点退出,该过滤器用于实现单点登出功能,可选配置 -->  
  15. <listener>  
  16.     <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>  
  17. </listener>  


注意单点登出在测试时,访问https://zhuajindian.com:8443/cas/logout登出后直接刷新client端,是没有退出的,需要在客户端有其他请求后才会通知退出,这个不知道是什么原因引起的。盼交流回复

 

 

本文搭建的CAS4.1.4server+client实例下载地址:http://download.csdn.net/detail/chenhai201/9425625

cas 4.1.4单点登录实战

标签:cas   oar   filter   att   term   数据连接   title   map   str   

原文地址:http://www.cnblogs.com/dogdogwang/p/6360028.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!