1. 首页
  2. >
  3. 编程技术
  4. >
  5. PHP

单点登陆CAS的学习

单点登陆

单点登陆这个词并不陌生,单点登陆(Single Sign On),简称为 SSO,在多个应用系统中,用户只需登陆一次就可以访问其他相互信用的系统,不要重复的登陆。

单点登陆CAS的学习

CAS

CAS是Central Authentication Service的缩写,中央认证服务,一种独立开放指令协议。CAS 是 耶鲁大学(Yale University)发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。

特点

1、开源的企业级单点登录解决方案。

2、CAS Server 为需要独立部署的 Web 应用。

3、CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。

4、CAS属于Apache 2.0许可证,允许代码修改,再发布(作为开源或商业软件)。

原理步骤

从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。下图是 CAS 最基本的协议过程:

单点登陆CAS的学习

SSO单点登录访问流程主要有以下步骤:

1. 访问服务:SSO客户端发送请求访问应用系统提供的服务资源。

2. 定向认证:SSO客户端会重定向用户请求到SSO服务器。

3. 用户认证:用户身份认证。

4. 发放票据:SSO服务器会产生一个随机的Service Ticket。

5. 验证票据:SSO服务器验证票据Service Ticket的合法性,验证通过后,允许客户端访问服务。

6. 传输用户信息:SSO服务器验证票据通过后,传输用户认证结果信息给客户端。

CAS的服务端搭建

服务端搭建

下载cas的服务端的war包。该文版本:cas-server-4.0.0-release。

链接:https://pan.baidu.com/s/1Ldzu4xvbWlwZV3hcL0p6xA 提取码:vwwm

将cas-server-4.0.0\modules下的cas-server-webapp-4.0.0.war放入tomcat的wepapps目录下。

单点登陆CAS的学习

已修改名字

启动tomcat。浏览器输入localhost:8080/cas/login

单点登陆CAS的学习

默认账号密码:casuser,Mellon。

单点登陆CAS的学习

登陆为:localhost:8080/cas/logout

服务器其他配置

1.这里默认使用8080端口,可以修改端口。

1)打开tomcat 目录 conf\server.xml 找到下面的配置

单点登陆CAS的学习

将8080端口修改为你配置的端口,这里设置为9000。

2)修改CAS配置文件

修改cas的WEB-INF/cas.properties

单点登陆CAS的学习

3)重启tomcat

单点登陆CAS的学习

2.去除https认证

CAS默认使用的是HTTPS协议,如果使用HTTPS协议需要SSL安全证书(需向特定的机构申请和购买) 。如果对安全要求不高或是在开发测试阶段,可使用HTTP协议。我们这里讲解通过修改配置,让CAS使用HTTP协议。

1)修改cas的WEB-INF/deployerConfigContext.xml找到下面的配置:

单点登陆CAS的学习

增加参数p:requireSecure="false",requireSecure:是否需要安全验证,即HTTPS,false为不采用。

2)修改cas的/WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml

单点登陆CAS的学习

将参数p:cookieSecure="true",改为p:cookieSecure="false"。true为采用HTTPS验证,false为不验证。

将 p:cookieMaxAge="-1"改成p:cookieMaxAge="3600"。

参数p:cookieMaxAge="-1",是COOKIE的最大生命周期,-1为无生命周期,即只在当前打开的窗口有效,关闭或重新打开其它窗口,仍会要求验证。可以根据需要修改为大于0的数字,比如3600等,意思是在3600秒内,打开任意窗口,都不需要验证。

3)修改cas的WEB-INF/spring-configuration/warnCookieGenerator.xml

单点登陆CAS的学习

将参数p:cookieSecure="true",改为p:cookieSecure="false",将 p:cookieMaxAge="-1"改成p:cookieMaxAge="3600"。

3.添加其他账号

1)修改cas的WEB-INF/deployerConfigContext.xml找到下面的配置:

单点登陆CAS的学习

2)添加一个用户,账号admin,密码admin。


单点登陆CAS的学习

3)重启tomcat

输入admin,admin登陆成功。

单点登陆CAS的学习

CAS的客户端搭建

创建了两个客户端。新建两个个maven项目,cas_demo1和cas_demo2。

pom.xml添加如下依赖:

   <groupId>com.cas.test</groupId>
<artifactId>cas_demo1</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>

<dependencies>
<!-- cas -->
<dependency>
<groupId>org.jasig.cas.client</groupId>
<artifactId>cas-client-core</artifactId>
<version>3.3.3</version>
</dependency>

<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<!-- 指定端口 -->
<port>9001</port>
<!-- 请求路径 -->
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>

修改web.xml:


<!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置 -->
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
</listener>

<!-- 该过滤器用于实现单点登出功能,可选配置。 -->
<filter>
<filter-name>CAS Single Sign Out Filter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Single Sign Out Filter</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>http://localhost:9000/cas/login</param-value>
<!--这里的server是服务端的IP -->
</init-param>
<init-param>
<param-name>serverName</param-name>
<!--这里的本机的IP地址,用于认证成功的重定向 -->
<param-value>http://localhost:9001</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CASFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->
<filter>
<filter-name>CAS Validation Filter</filter-name>
<filter-class>
org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>http://localhost:9000/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:9001</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!-- 该过滤器负责实现HttpServletRequest请求的包裹, 比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。 -->
<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 HttpServletRequest Wrapper Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!-- 该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。 比如AssertionHolder.getAssertion().getPrincipal().getName()。 -->
<filter>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Assertion Thread Local Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<welcome-file-list>
<welcome-file>/WEB-INF/index.jsp</welcome-file>
</welcome-file-list>

index.jsp只是简单的显示登陆的账号和成功信息。

单点登陆CAS的学习

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>cas-client-demo1</title>
</head>
<body>
登陆成功,用户名: <%=request.getRemoteUser() %>

<a href="http://localhost:9000/cas/logout?service=http://localhost:9000/cas/login">退出登录</a>
</body>
</html>

cas_demo2客户端的代码类似,只是pom.xml,web.xml的中的端口配置为9002。

启动cas_demo1和cas_demo2。

单点登陆CAS的学习

地址栏输入http://localhost:9001/和http://localhost:9002/ ,地址均会跳转到CAS登录页。

输入用户名和密码后,页面跳转回9001的主页面 ,再次访问9002也可以打开主页面。

单点登陆CAS的学习

点击退出登陆并不能跳转,这时需要添加其他的配置。

修改cas系统的配置文件cas-servlet.xml。


单点登陆CAS的学习

将cas.logout.followServiceRedirects:false改为true。重启后,点击退出登陆,跳转成功。

CAS服务端数据源设置

一般用户的账号名密码存在数据库中,这里从数据库中获取账号密码验证登陆。

修改cas服务端中web-inf下deployerConfigContext.xml ,添加如下配置

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"  
p:driverClass="com.mysql.jdbc.Driver"
p:jdbcUrl="jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8"
p:user="root"
p:password="" />

<bean id="passwordEncoder"
class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder"
c:encodingAlgorithm="MD5"
p:characterEncoding="UTF-8" />

<bean id="dbAuthHandler"
class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"
p:dataSource-ref="dataSource"
p:sql="select password from sys_user where username = ?"
p:passwordEncoder-ref="passwordEncoder"/>

然后在配置文件开始部分找到如下配置。

<bean id="authenticationManager" class="org.jasig.cas.authentication.PolicyBasedAuthenticationManager">
<constructor-arg>
<map>
<entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
<entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />
</map>
</constructor-arg>
<property name="authenticationPolicy">
<bean class="org.jasig.cas.authentication.AnyAuthenticationPolicy" />
</property>
</bean>

其中

<entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />

一句是使用固定的用户名和密码,我们在下面可以看到这两个bean ,如果我们使用数据库认证用户名和密码,需要将这句注释掉。

添加下面这一句配置

<entry key-ref="dbAuthHandler" value-ref="primaryPrincipalResolver"/>

将以下三个jar包放入webapps\cas\WEB-INF\lib下 。重启服务。

单点登陆CAS的学习

test数据库中有个sys_user表,其中用户为test,密码为test,已加密。

单点登陆CAS的学习

输入地址,用数据库中用户测试登陆,测试成功。


单点登陆CAS的学习