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 最基本的协议过程:
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目录下。
已修正名字
启动tomcat。浏览器输入localhost:8080/cas/login
默认账号密码:casuser,Mellon。
上岸为:localhost:8080/cas/logout
做事器其他配置
1.这里默认利用8080端口,可以修正端口。
1)打开tomcat 目录 conf\server.xml 找到下面的配置
将8080端口修正为你配置的端口,这里设置为9000。
2)修正CAS配置文件
修正cas的WEB-INF/cas.properties
3)重启tomcat
2.去除https认证
CAS默认利用的是HTTPS协议,如果利用HTTPS协议须要SSL安全证书(需向特定的机构申请和购买) 。如果对安全哀求不高或是在开拓测试阶段,可利用HTTP协议。我们这里讲解通过修正配置,让CAS利用HTTP协议。
1)修正cas的WEB-INF/deployerConfigContext.xml找到下面的配置:
增加参数p:requireSecure="false",requireSecure:是否须要安全验证,即HTTPS,false为不采取。
2)修正cas的/WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml
将参数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
将参数p:cookieSecure="true",改为p:cookieSecure="false",将 p:cookieMaxAge="-1"改成p:cookieMaxAge="3600"。
3.添加其他账号
1)修正cas的WEB-INF/deployerConfigContext.xml找到下面的配置:
2)添加一个用户,账号admin,密码admin。
3)重启tomcat
输入admin,admin上岸成功。
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只是大略的显示上岸的账号和成功信息。
<%@ 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。
地址栏输入http://localhost:9001/和http://localhost:9002/ ,地址均会跳转到CAS登录页。
输入用户名和密码后,页面跳转回9001的主页面 ,再次访问9002也可以打开主页面。
点击退出上岸并不能跳转,这时须要添加其他的配置。
修正cas系统的配置文件cas-servlet.xml。
将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下 。重启做事。
test数据库中有个sys_user表,个顶用户为test,密码为test,已加密。
输入地址,用数据库中用户测试上岸,测试成功。