CAS单点登录实战

搞了老半天,单点登录终于弄好了,此文是初步接触单点登录的入门指南,分享一下:


准备环境

  • windows7 64位
  • JDK 1.6.0_10
  • Tomcat 6.0.20(准备三份tomcat,分别名为tomcat-6.0.20-app1,tomcat-6.0.20-app2,tomcat-6.0.20-cas-server,修改startup和shutdown的端口)
  • CAS-server-4.0.0CAS-client-3.3.3

步骤:

1、修改 hosts 文件

C:\Windows\System32\drivers\etc\hosts 文件中添加三条
127.0.0.1    server.cas.com
127.0.0.1    app1.cas.com
127.0.0.1    app2.cas.com
  • server.cas.com    =>> 对应部署cas server的tomcat(tomcat-6.0.20-cas-server),这个虚拟域名还用于证书生成
  • app1.cas.com       =>>  对应部署app1 的tomcat(tomcat-6.0.20-app1
  • app2.cas.com       =>> 对应部署app2 的tomcat(tomcat-6.0.20-app2

2、安全证书配置

使用JDK自带的keytool工具进行安全证书配置(详细运用
2.1、生成证书
打开命令提示符(cmd), 到JDK下bin所在的路径:

因为我想将生成的证书存在某一个文件夹下,但是执行下面的命令(D:\keystore\ssodemo.keystore)会报权限或者找不到的错误,所以直接放在D 盘下.
 
keytool -genkey -alias ssodemo -keyalg RSA -keysize 1024 -keypass michaelpwd -validity 365 -keystore D:\ssodemo.keystore -storepass michaelpwd  
有一点需要注意:keypass 和 storepass 两个密码要一致,否则tomcat 配置https 访问失败

      
     2.2、导出证书

             keytool -export -alias ssodemo -keystore D:\ssodemo.keystore -file D:\ssodemo.crt -storepass michaelpwd
             

      
      2.3、客户端导入证书   
         
            keytool -import -keystore %JAVA_HOME%\jre\lib\security\cacerts2 -file D:\ssodemo.crt -alias ssodemo
               

              至此,我们就能在%JAVA_HOME%\jre\lib\security\下看到名为cacerts2的文件了。
 




3、部署CAS-Server相关的Tomcat

    3.1、配置HTTPS
   
           打开  tomcat-6.0.20-cas-server\conf下的service.xml
           修改为:
        <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"               
			   keystoreFile="D:/ssodemo.keystore" keystorePass="michaelpwd"
	           clientAuth="false" sslProtocol="TLS" URIEncoding="UTF-8"/>

            参数说明:

                              keystoreFile 就是4.1中创建证书的路径

                              keystorePass 就是4.1中创建证书的密码

      

       3.2、配置cas-service

               找到cas-server-webapp-4.0.0.war,命名为casTest.war,将该war包放到tomcat-6.0.20-cas-server/webapp下

               启动该tomcat,在浏览器输入  http://server.cas.com:8443/casTest/login,若显示如下界面,说明service端配置成功。

                



4、部署CAS-Client相关的Tomcat
 

     CAS-Client 下载地址:http://downloads.jasig.org/cas-clients/

     以cas-client-3.2.1-release.zip 为例,解压提取cas-client-3.2.1/modules/cas-client-core-3.2.1.jar

     随便找一个简单的web项目,命名为client, 将 cas-client-core-3.2.1.jar放到该web项目下,分别将项目放到

     tomcat-6.0.20-app1和tomcat-6.0.20-app2中。     

     

     4.1、配置tomcat-6.0.20-app1

              
               打开tomcat-6.0.20-app1\webapps\client\WEB-INF\web.xml
               在web.xml的最前面添加cas的配置:
               
          <!-- ======================== 单点登录开始 ======================== -->
	        <!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置-->
			<!-- 注意:CAS登录Filter必须在所有web应用程序Filter之前 -->
	        <listener>
	            <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
	        </listener>
	 
	        <!-- 该过滤器用于实现单点登出功能,可选配置。 -->
	        <filter>
	            <filter-name>casSignOutFilter</filter-name>
	            <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
	        </filter>
	        <filter-mapping>
	            <filter-name>casSignOutFilter</filter-name>
	            <url-pattern>/*</url-pattern>
	        </filter-mapping>
	 
	        <filter>
	            <filter-name>casFilter</filter-name>
	            <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
	            <init-param>
	                <param-name>casServerLoginUrl</param-name>
					<!-- 单点登录服务器 -->
	                <param-value>https://service.cas.com:8443/casTest/login</param-value>
	            </init-param>
	            <init-param>
	                <param-name>serverName</param-name>
					<!-- client-1 -->
	                <param-value>http://app1.cas.com:8060</param-value>
	            </init-param>
	        </filter>
	        <filter-mapping>
	            <filter-name>casFilter</filter-name>
	            <url-pattern>/*</url-pattern>
	        </filter-mapping>
                <!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->
	        <filter>
	            <filter-name>casValidationFilter</filter-name>
	            <filter-class>
	                org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
	            <init-param>
	                <param-name>casServerUrlPrefix</param-name>
	                <param-value>https://service.cas.com:8443/casTest</param-value>
	            </init-param>
	            <init-param>
	                <param-name>serverName</param-name>
                <param-value>http://app1.cas.com:8060</param-value>
	            </init-param>
	        </filter>
	        <filter-mapping>
	            <filter-name>casValidationFilter</filter-name>
	            <url-pattern>/*</url-pattern>
	        </filter-mapping>
	 
	        <!--
	            该过滤器负责实现HttpServletRequest请求的包裹,
	            比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。
                -->
	        <filter>
	            <filter-name>casHttpServletRequestWrapperFilter</filter-name>
	            <filter-class>
	                org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
	        </filter>
                 <filter-mapping>
	            <filter-name>casHttpServletRequestWrapperFilter</filter-name>
	            <url-pattern>/*</url-pattern>
	        </filter-mapping>
	 
	       <!--
	        该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。
	        比如AssertionHolder.getAssertion().getPrincipal().getName()。
	        -->
	        <filter>
	            <filter-name>casAssertionThread LocalFilter</filter-name>
	            <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
	        </filter>
	        <filter-mapping>
                    <filter-name>casAssertionThread LocalFilter</filter-name>
	            <url-pattern>/*</url-pattern>
                 </filter-mapping>
	 
	   <!-- ======================== 单点登录结束 ======================== -->


  
     4.2、配置tomcat-6.0.20-app2  
 
               
              打开tomcat-6.0.20-app1\webapps\client\WEB-INF\web.xml
              在web.xml的最前面添加cas的配置:        
              
           <!-- ======================== 单点登录开始 ======================== -->
	        <!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置-->
			<!-- 注意:CAS登录Filter必须在所有web应用程序Filter之前 -->
	        <listener>
	            <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
	        </listener>
	 
	        <!-- 该过滤器用于实现单点登出功能,可选配置。 -->
	        <filter>
	            <filter-name>casSignOutFilter</filter-name>
	            <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
	        </filter>
	        <filter-mapping>
	            <filter-name>casSignOutFilter</filter-name>
	            <url-pattern>/*</url-pattern>
	        </filter-mapping>
	 
	        <filter>
	            <filter-name>casFilter</filter-name>
	            <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
	            <init-param>
	                <param-name>casServerLoginUrl</param-name>
					<!-- 单点登录服务器 -->
	                <param-value>https://service.cas.com:8443/casTest/login</param-value>
	            </init-param>
	            <init-param>
	                <param-name>serverName</param-name>
					<!-- client-2 -->
	                <param-value>http://app2.cas.com:8070</param-value>
	            </init-param>
	        </filter>
	        <filter-mapping>
	            <filter-name>casFilter</filter-name>
	            <url-pattern>/*</url-pattern>
	        </filter-mapping>
                <!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->
	        <filter>
	            <filter-name>casValidationFilter</filter-name>
	            <filter-class>
	                org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
	            <init-param>
	                <param-name>casServerUrlPrefix</param-name>
	                <param-value>https://service.cas.com:8443/casTest</param-value>
	            </init-param>
	            <init-param>
	                <param-name>serverName</param-name>
                <param-value>http://app2.cas.com:8070</param-value>
	            </init-param>
	        </filter>
	        <filter-mapping>
	            <filter-name>casValidationFilter</filter-name>
	            <url-pattern>/*</url-pattern>
	        </filter-mapping>
	 
	        <!--
	            该过滤器负责实现HttpServletRequest请求的包裹,
	            比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。
                -->
	        <filter>
	            <filter-name>casHttpServletRequestWrapperFilter</filter-name>
	            <filter-class>
	                org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
	        </filter>
                 <filter-mapping>
	            <filter-name>casHttpServletRequestWrapperFilter</filter-name>
	            <url-pattern>/*</url-pattern>
	        </filter-mapping>
	 
	       <!--
	        该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。
	        比如AssertionHolder.getAssertion().getPrincipal().getName()。
	        -->
	        <filter>
	            <filter-name>casAssertionThread LocalFilter</filter-name>
	            <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
	        </filter>
	        <filter-mapping>
                    <filter-name>casAssertionThread LocalFilter</filter-name>
	            <url-pattern>/*</url-pattern>
                 </filter-mapping>
	 
	   <!-- ======================== 单点登录结束 ======================== -->


            注意,如果不用域名来配置的,而用localhost代替的话,登录成功可能后会报:
            错误信息:javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No name matching localhost found
                         Caused by: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No name matching localhost found 

        
        4.3、修改casServiceValidationSuccess.jsp文件 

                注意:默认cas登录服务器没有把用户信息传到客户端中,所以要修改WEB-INF\view\jsp\protocol\2.0\casServiceValidationSuccess.jsp文件,
               增加:              
               
<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:${fn:escapeXml(attr.key)}>${fn:escapeXml(attr.value)}</cas:${fn:escapeXml(attr.key)}>                        
      </c:forEach>    
   </cas:attributes>  
</c:if> 

               后台获取登录的用户名可以用这种方式获取:
               
AttributePrincipal principal = (AttributePrincipal)request.getUserPrincipal();   
String username = principal.getName();

5、验证单点登录
 
        分别启动tomcat ,
       tomcat-6.0.20-cas-server,tomcat-6.0.20-app1,tomcat-6.0.20-app2
        在浏览器输入:http://app1.cas.com:8060/client后,就会跳转到cas的默认登录界面
        输入正确后,跳转到client的首页,
        再次浏览器输入:http://app2.cas.com:8070/client后,直接跳转到client的首页,说明单点配置登录成功。
               





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值