CAS统一登录认证(3): CAS 客户端接入实践

                              CAS 客户端接入实践

一、接入准备

        为了实现Cas单点登录的接入与验证,我这里准备部署三个系统,一个是之前我们搭建的服务端,这个服务端完全是Cas提供的,还有两个是我们自己编写的并且引入的Cas 客户端的接入应用,具体情况如下表所示:

应用 域名  端口 系统描述 来源 url
CASServer cas-server.com 443 *认证服务 官网下载 http://cas-server.com:8080/cas/
CasClient1 cas-client1.com 8081 接入系统1 自行编写的demo http://cas-client1.com:8081/CasClient1/
CasClient2 cas-client2.com 8082 接入系统2 自行编写的demo http://cas-client1.com:8082/CasClient2/

接下来我们修改一下host文件,便于我们使用域名来访问系统,实现跨域的测试,host文件路径为:C:\Windows\System32\drivers\etc\host,配置的host文件内容如下:

127.0.0.1   cas-server.com
127.0.0.1   cas-client1.com
127.0.0.1   cas-client2.com

CAS统一登录认证(3): CAS 客户端接入实践

二、编写测试端程序

cas 官方demo:https://github.com/cas-projects/cas-sample-java-webapp

2.1 新增一个maven程序,并在pom.xml中添加Cas Client 依赖,依赖如下:

<dependency>
    <groupId>org.jasig.cas.client</groupId>
    <artifactId>cas-client-core</artifactId>
    <version>3.4.1</version>
</dependency>

2.2 在web.xml中添加Cas Client 的拦截过滤配置,配置如下:

<!-- 用于退出的fiflter -->
<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>
        <param-value>http://cas-server.com:8080/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.Saml11AuthenticationFilter</filter-class>-->
    <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
    <init-param>
        <param-name>casServerLoginUrl</param-name>
        <param-value>http://cas-server.com:8080/cas/login</param-value>
    </init-param>
    <init-param>
        <param-name>serverName</param-name>
        <param-value>http://cas-client1.com:8081</param-value>
    </init-param>
</filter>

<!-- 这个是对st票据的校验,其实cas中也就是通过这种方式来确定是否是同一个人 -->
<filter>
    <filter-name>CAS Validation Filter</filter-name>
    <!--<filter-class>org.jasig.cas.client.validation.Saml11TicketValidationFilter</filter-class>-->
    <filter-class>org.jasig.cas.client.validation.Cas30ProxyReceivingTicketValidationFilter</filter-class>
    <init-param>
        <param-name>casServerUrlPrefix</param-name>
        <param-value>http://cas-server.com:8080/cas</param-value>
    </init-param>
    <init-param>
        <param-name>serverName</param-name>
        <param-value>http://cas-client1.com:8081</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>

<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>

2.3 按照上述两个步骤,创建CasClient2。

2.4 新增出来的CasClient1和CasClient2如下所示:

CAS统一登录认证(3): CAS 客户端接入实践

2.5 将CasClient1部署在端口为8081的tomcat上,将CasClient2部署在端口为8082的tomcat上,启动两个项目。

三、单点登录测试

        启动Cas Server,访问CasClient1,发现显示未授权,情况如下图所示:

CAS统一登录认证(3): CAS 客户端接入实践

这是因为我们没有配置好哪些服务可以接入并使用我们的sso进行鉴权,打开Cas Server中的resources/services文件夹下面的  HTTPSandIMAPS-10000001.json,发现只配置了https、|imaps但是没有http,而我们使用的是http协议,解决办法:添加http协议。

CAS统一登录认证(3): CAS 客户端接入实践   

然后在配置文件application.properties下添加配置:

##
# Service Registry(服务注册)
#
# 开启识别Json文件,默认false
cas.serviceRegistry.initFromJson=true 
# 保存tgc
cas.tgc.secure=false
tgc.name=TGC

重新启动之后,再次访问http://cas-client1.com:8081/CasClient1/,自动重定向到cas登录页面,注意这里的URL,变成了http://cas-server.com/cas/login?service=http%3A%2F%2Fcas-client1.com%3A8081%2FCasClient1%2F,页面如下:

CAS统一登录认证(3): CAS 客户端接入实践

输入账号密码(casuser/Mellon)登录,即可认证通过成功访问CasClient1的页面: 

CAS统一登录认证(3): CAS 客户端接入实践
然后访问http://cas-client2.com:8082/CasClient2/,不会重定向到登录页面,直接到CasClient2的页面: 

CAS统一登录认证(3): CAS 客户端接入实践
访问cas认证中心http://cas-server.com:8080/cas/,也是直接到登录成功的页面: 

CAS统一登录认证(3): CAS 客户端接入实践
如果要单点注销登录,直接访问http://cas-server.com:8080/cas/logout

CAS统一登录认证(3): CAS 客户端接入实践
单点登录功能整合完成了。