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 官方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如下所示:
、
2.5 将CasClient1部署在端口为8081的tomcat上,将CasClient2部署在端口为8082的tomcat上,启动两个项目。
三、单点登录测试
启动Cas Server,访问CasClient1,发现显示未授权,情况如下图所示:
这是因为我们没有配置好哪些服务可以接入并使用我们的sso进行鉴权,打开Cas Server中的resources/services文件夹下面的 HTTPSandIMAPS-10000001.json,发现只配置了https、|imaps但是没有http,而我们使用的是http协议,解决办法:添加http协议。
然后在配置文件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,页面如下:
输入账号密码(casuser/Mellon)登录,即可认证通过成功访问CasClient1的页面:
然后访问http://cas-client2.com:8082/CasClient2/,不会重定向到登录页面,直接到CasClient2的页面:
访问cas认证中心http://cas-server.com:8080/cas/,也是直接到登录成功的页面:
如果要单点注销登录,直接访问http://cas-server.com:8080/cas/logout
单点登录功能整合完成了。