1.CAS特点
(1)开源的企业级单点登录解决方案。
(2)CAS Server 为需要独立部署的 Web 应用。
(3)CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。
从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。
CAS Server 需要独立部署,主要负责对用户的认证工作;
CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。
2.SSO单点登录访问流程
(1)访问服务:SSO客户端发送请求访问应用系统提供的服务资源。
(2)定向认证:SSO客户端会重定向用户请求到SSO服务器。
(3)用户认证:用户身份认证。
(4)发放票据:SSO服务器会产生一个随机的Service Ticket。
(5)验证票据:SSO服务器验证票据Service Ticket的合法性,验证通过后,允许客户端访问服务。
(6)传输用户信息:SSO服务器验证票据通过后,传输用户认证结果信息给客户端。
3.CAS服务端部署
(1)到 https://github.com/apereo/cas/releases/tag/v4.0.0 下载4.0版本
(2)解压后,拷贝cas-server-4.0.0\modules\cas-server-webapp-4.0.0.war 并重命名cas.war放到tomcat\webapps目录下
(3)启动tomcat,并进行访问,默认8080端口
固定用户名密码:casuse、Mellon
查看tomcat-7-cas\webapps\cas\WEB-INF\deployerConfigContext.xml配置文件
可以自己在该配置文件该位置添加用户,以方便后期测试
4.CAS服务端配置
(1)修改端口号
- 修改tomcat端口号:tomcat-7-cas\conf\server.xml (修改成9999)
- 修改cas配置文件:tomcat-7-cas\webapps\cas\WEB-INF\cas.properties(修改成server.name=http://localhost:9999)
(2)去除https认证
CAS默认使用的是HTTPS协议,如果使用HTTPS协议需要SSL安全证书(需向特定的机构申请和购买) 。如果对安全要求不高或是在开发测试阶段,可使用HTTP协议。
- 打开WEB-INF\deployerConfigContext.xml找到 id=”proxyAuthenticationHandler” 在里面添加属性p:requireSecure=”false”
<bean id="proxyAuthenticationHandler"
class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
p:httpClient-ref="httpClient" p:requireSecure="false"/>
注:requireSecure属性意思为是否需要安全验证,即HTTPS,false为不采用
- tomcat-7-cas\webapps\cas\WEB-INF\spring-configuration\ticketGrantingTicketCookieGenerator.xml修改配置文件如下
<!-- cookieSecure :https协议的,cookieMaxAge:cookie生命周期 -->
<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="false"
p:cookieMaxAge="3600"
p:cookieName="CASTGC"
p:cookiePath="/cas" />
- tomcat-7-cas\webapps\cas\WEB-INF\spring-configuration\warnCookieGenerator.xml修改配置文件如下
<bean id="warnCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="false"
p:cookieMaxAge="3600"
p:cookieName="CASPRIVACY"
p:cookiePath="/cas" />
5.CAS客户端
(1)创建maven工程
(2)引入依赖pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.chen.cas.demo</groupId>
<artifactId>casclient-demo</artifactId>
<version>0.0.1-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>
</project>
(3)引入web.xml配置文件 (原生方式需要配置,与spring整合是不需要配的)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<!-- 单点退出,该过滤器用于实现单点登出功能,可选 -->
<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>
<!-- cas服务器-->
<param-value>http://localhost:9999/cas/login</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>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:9999/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请求的包裹,可选-->
<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来获取用户的登录名。 -->
<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>
</web-app>
(4)编写测试页面index.jsp
<title>cas test</title>
</head>
<body>
单点登录测试页面~~~~CASTEST9001<br>
当前用户:<%= request.getRemoteUser() %>
</body>
</html>
(5)创建工程2,配置参考上述,修改端口号9002
(6)之后便可启动两个项目并启动cas服务
(7)单点登录退出:http://localhost:9999/cas/logout
(8)退出跳转:修改配置文件 cas\WEB-INF\cas-servlet.xml
<!-- 将false修改成true 即可 -->
<bean id="logoutAction" class="org.jasig.cas.web.flow.LogoutAction"
p:servicesManager-ref="servicesManager"
p:followServiceRedirects="${cas.logout.followServiceRedirects:true}"/>
(9)修改后可重定向 http://localhost:9999/cas/logout?service=http:/localhost:8080/test
至此,基本就完成了CAS测试了
6.修改服务器数据源(用户名、密码从数据库中读取)
(1)配置数据源:修改cas服务端中WEB-INF\deployerConfigContext.xml,添加如下配置
<!-- 配置数据源 -->
<!--这里用了c3p0数据源,可以根据自己需要进行修改 -->
<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="123456" />
<!-- 密码加密 -->
<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 t_user where username = ?"
p:passwordEncoder-ref="passwordEncoder"/>
(2)然后在配置文件开始部分找到如下配置
<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" />
-->
<!-- 使用数据库认证用户名和密码时添加这一句 -->
<entry key-ref="dbAuthHandler" value-ref="primaryPrincipalResolver"/>
</map>
</constructor-arg>
<property name="authenticationPolicy">
<bean class="org.jasig.cas.authentication.AnyAuthenticationPolicy" />
</property>
</bean>
2.添加三个jar包放入webapps\cas\WEB-INF\lib下
- c3p0-0.9.1.2.jar
- cas-server-support-jdbc-4.0.0.jar
- mysql-connector-java-5.1.32.jar
之后重启cas服务器及两个测试工程
运行正常,用户也是读取的数据库数据,完美~~~