【SSO单点登录】10.CAS框架实现单点登录(三)

本文章由聚项云平台博客独家原创,转载请注明出处:http://blog.jxcode.com/?p=3298&preview=true

上一篇我们讲解了CAS服务端样例工程的部署和启动,本篇我们来讲解客户端的搭建,以及客户端与服务端之间的交互过程。

一、配置客户端的证书(证书相关解释查看第8篇)
首先复制之前的服务端的JDK8,然后删除C:\Program Files\Java2\jdk1.8.0_171\jre\lib\security下的证书“cacerts”,重新为该JDK配置证书:
图10.0.1

打开cmd控制台,然后输入以下命令:

 keytool -genkey -alias ssodemo2 -keyalg RSA -keysize 1024 -keypass castest2 -validity 365 -keystore c:\castest2.keystore -storepass castest2

系统会提示输入以下信息:
图10.0.2
其中“您的名字与姓氏是什么”必须制定hosts下的服务端域名“client1.castest.com”。
然后在cmd窗口输入以下命令导出证书:

 keytool -export -alias ssodemo2 -keystore c:\castest2.keystore -file c:\ssodemo2.crt -storepass castest2

然后到C盘后可以看到生成了响应的crt文件:
图10.0.3
然后将证书导入到JDK的证书库文件中:

 keytool -import -trustcacerts -alias ssodemo2 -keystore “C:/Program Files/Java2/jdk1.8.0_171/jre/lib/security/cacerts” -file c:/ssodemo2.crt -storepass changeit

回车后填写秘钥库口令的时候,storepass密码必须要输入changeit:
图10.0.4

 

 

二、下载客户端示例并部署
我们打开CAS的官方GitHub仓库:https://github.com/cas-projects,在首页我们可以看到客户端的工程样例:
图10.1
可以看到下面的介绍就是“受CAS保护的Java简单web应用示例”,我们点击进去,点击zip格式下载:
图10.2
下载解压之后,是一个标准的java的maven工程:
图10.3
我们将其解压之后以maven工程导入Eclipse中:
图10.4

图10.5
这里我们将Java版本更新成了为本机自带的,装有证书的jdk1.8:
图10.6

图10.7

观察上面的结构,我们可以看出该工程内置了jetty容器(功能类似tomcat,是一个轻量级的Java容器),我们这里因为需要使用tomcat测试,所以下面就导入tomcat中即可。

观察一下工程的pom.xml文件的dependencies依赖部分:

 <dependencies>
     <dependency>
         <groupId>commons-logging</groupId>
         <artifactId>commons-logging</artifactId>
         <version>1.1.1</version>
     </dependency>

    <dependency>
         <groupId>log4j</groupId>
         <artifactId>log4j</artifactId>
         <version>1.2.17</version>
    </dependency>

    <dependency>
         <groupId>org.jasig.cas.client</groupId>
         <artifactId>cas-client-core</artifactId>
         <version>3.4.1</version>
         <exclusions>
             <exclusion>
                 <groupId>javax.servlet</groupId>
                 <artifactId>servlet-api</artifactId>
              </exclusion>
         </exclusions>
     </dependency>
 </dependencies>

可以看到引入了cas-client-core的依赖,该依赖是CAS客户端的核心依赖。
为了更方便的打印日志信息,我们在dependencies中引入下面两个依赖:

 <dependency>
     <groupId>org.slf4j</groupId>
     <artifactId>slf4j-api</artifactId>
     <version>1.7.25</version>
 </dependency>

<dependency>
     <groupId>org.slf4j</groupId>
     <artifactId>slf4j-log4j12</artifactId>
     <version>1.7.25</version>
 </dependency>

客户端如何响应请求,并且的认证服务器地址等核心信息,都配置在web.xml中,这里我们会对web.xml进行一些修改,为了方便大家理解,其中添加了一些注释,下面来看一下修改后的配置文件内容:

 <?xml version="1.0" encoding="UTF-8"?>
 <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<!--用来控制cas识别的session的保存,以及判断是否是登出请求-->
 <filter>
     <filter-name>CAS Single Sign Out Filter</filter-name>
     <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
     <init-param>
         <param-name>casServerUrlPrefix</param-name>
         <!--认证服务端的应用地址(和之前申请的keystore中的CN一致),端口为服务端应用运行的tomcat的端口,域名必须一致-->
        <param-value>https://server.castest.com:8081/cas</param-value>
     </init-param>
 </filter>

<listener>
     <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
 </listener>

 <!--用来跳转登录-->
 <filter>
     <filter-name>CAS Authentication Filter</filter-name>
     <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
     <init-param>
         <param-name>casServerLoginUrl</param-name>
         <!--认证服务端的应用地址(和之前申请的keystore中的CN一致)下的登录界面,端口为服务端应用运行的tomcat的端口,域名必须一致-->
         <param-value>https://server.castest.com:8081/cas/login</param-value>
     </init-param>
     <init-param>
         <param-name>serverName</param-name>
         <!--客户端的部署地址,认证时会带着这个地址,认证成功后会跳转到这个地址-->
         <param-value>https://client1.castest.com:8082</param-value>
     </init-param>
 </filter>

 <!--用来验证ticket-->
 <filter>
     <filter-name>CAS Validation Filter</filter-name>
     <filter-class>org.jasig.cas.client.validation.Cas30ProxyReceivingTicketValidationFilter</filter-class>
     <init-param>
         <param-name>casServerUrlPrefix</param-name>
         <!--认证服务端的应用地址(和之前申请的keystore中的CN一致),端口为服务端应用运行的tomcat的端口,域名必须一致-->
         <param-value>https://server.castest.com:8081/cas</param-value>
     </init-param>
     <init-param>
         <param-name>serverName</param-name>
         <!--客户端的部署地址,认证时会带着这个地址,认证成功后会跳转到这个地址-->
         <param-value>https://client1.castest.com:8082</param-value>
     </init-param>
     <init-param>
         <param-name>redirectAfterValidation</param-name>
         <param-value>true</param-value>
     </init-param>
     <init-param>
         <param-name>useSession</param-name>
         <param-value>true</param-value>
     </init-param>
     <init-param>
        <param-name>authn_method</param-name>
         <param-value>mfa-duo</param-value>
     </init-param>
 </filter>

  <!--用来封装request-->
 <filter>
     <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
     <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
 </filter>

<filter-mapping>
     <filter-name>CAS Single Sign Out Filter</filter-name>
     <url-pattern>/*</url-pattern>
 </filter-mapping>

<filter-mapping>
     <filter-name>CAS Validation Filter</filter-name>
     <url-pattern>/*</url-pattern>
 </filter-mapping>

<filter-mapping>
     <filter-name>CAS Authentication Filter</filter-name>
     <url-pattern>/*</url-pattern>
 </filter-mapping>

<filter-mapping>
     <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
     <url-pattern>/*</url-pattern>
 </filter-mapping>

<welcome-file-list>
     <welcome-file>
         index.jsp
     </welcome-file>
 </welcome-file-list>
 </web-app>

可以看到,整个web.xml一共配置了四个过滤器和一个监听器,这四个过滤器分别起到如下作用:
(1)CAS Single Sign Out Filter
该过滤器主要用来控制cas对认证好的用户的session的保存,以及判断是否用户发出的是登出请求
(2)CAS Authentication Filter
该过滤器主要作用是检测用户是否认证后的状态,如果不是,则按照配置的认证服务登录地址跳转到认证页面,待用户认证登录成功之后,返回配置的客户端回调页面。
(3)CAS Validation Filter
该过滤器的主要作用是验证从用户在认证服务端认证后的的票据信息,来决定用户是认证成功跳转至客户端首页,还是跳转回认证页面重新认证。
(4)CAS HttpServletRequest Wrapper Filter
该过滤器的主要作用是封装请求的request,来符合cas的认证请求参数。

可以看到,我们将上一篇部署的服务端的地址配置在了web.xml,这里的客户端我们也配置了之前客户端tomcat的地址(其实都是127.0.0.1)和端口。

下面我们将工程部署到之前配置的客户端的tomcat中(apache-tomcat-8.5.31-client1):
图10.8图10.9
注意:这里我使用的是MyEclipse,Eclipse的操作稍有不同,一定保证部署在真实的tomcat目录中。

最后,不要忘记在客户端的tomcat的server.xml中也配置HTTPS的证书信息:

 <Connector port="8082" protocol="org.apache.coyote.http11.Http11NioProtocol"
 maxThreads="150" SSLEnabled="true">
     <SSLHostConfig>
         <Certificate certificateKeystoreFile="C:/castest2.keystore"
     type="RSA" certificateKeystoreType="JKS" certificateKeystorePassword="castest"/>
     </SSLHostConfig>
 </Connector>

其中的证书路径就是一开始我们生成的证书。

然后在最后的HOST中配置tomcat默认路径访问客户端应用“cas-sample-java-webapp”:

 <Context path="/" docBase="cas-sample-java-webapp" debug="0" reloadable="true"/>

在启动客户端之前,要保证我们的服务端tomcat也在运行,不然的话会直接认证失败。
启动客户端tomcat,在浏览器中输入客户端地址https://client1.castest.com:8082,可以看到客户端直接跳转至认证服务端:
图10.11
观察url路径,可以看到在login后有一些参数,这些参数就是我们之前配置的认证成功后跳转回客户端的地址。

我们在之前的服务端的认证数据库中创建了一些认证的测试账号:
图10.12
我们首先输入jack的错误密码,会看到认证失败的信息,且没有跳回客户端:
图10.13
然后输入正确的jack密码,认证成功,此时观察服务端的tomcat控制台日志,可以看到jack认证成功的信息:
图10.14
此时浏览器会自动跳转回之前设置的回调配置,也就是客户端地址:

图10.15 通过观察url地址可以发现,我们每一次访问客户端时,都会带着ticket信息,这说明客户端认证用户是否登录的原则就是,该ticket是否已经在服务端认证过了。

至此,CAS的服务端和客户端的下载和部署已经讲解完毕,后面的博文中我们将详细探讨CAS的认证原理和机制。

未经允许不得转载:JX BLOG » 【SSO单点登录】10.CAS框架实现单点登录(三)

赞 (0)

评论 0

评论前必须登录!

登陆 注册