单点登陆(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案
之一。SSO 的定义是在多个应用系统中,用户只须要登陆一次就能够访问全部相互信任的应
用系统。
咱们目前的系统存在诸多子系统,而这些子系统是分别部署在不一样的服务器中,那么使
用传统方式的 session 是没法解决的,咱们须要使用相关的单点登陆技术来解决。css
CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登
录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具备如下特色:
1.开源的企业级单点登陆解决方案。
2.CAS Server 为须要独立部署的 Web 应用。
3.CAS Client 支持很是多的客户端(这里指单点登陆系统中的各个 Web 应用),包括
Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。html
SSO 单点登陆访问流程主要有如下步骤:
1. 访问服务:SSO 客户端发送请求访问应用系统提供的服务资源。
2. 定向认证:SSO 客户端会重定向用户请求到 SSO 服务器。
3. 用户认证:用户身份认证。
4. 发放票据:SSO 服务器会产生一个随机的 Service Ticket。java
5. 验证票据:SSO 服务器验证票据 Service Ticket 的合法性,验证经过后,容许客户端访问
服务。mysql
6. 传输用户信息:SSO 服务器验证票据经过后,传输用户认证结果信息给客户端。web
关于cas的配置spring
1.将cas.war放tomcat的webappssql
2.运行tomcat 的startup.bat数据库
3.CAS 服务端配置
端口修改
若是咱们不但愿用 8080 端口访问 CAS, 能够修改端口
(1) 修改 TOMCAT 的端口
打开 tomcat 目录 conf\server.xml 找到下面的配置
将端口 8080, 改成 9000 apache
(2) 修改 CAS 配置文件
修改 cas 的 WEB-INF/cas.properties
server.name=http://localhost:9000 api
4.去除https认证
(1)修改 cas 的 WEB-INF/deployerConfigContext.xml
<bean
class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationH
andler"
p:httpClient-ref="httpClient"/>
这里须要增长参数 p:requireSecure="false", requireSecure 属性意思为是否须要安全验证, 即
HTTPS, false 为不采用
(2)修改 cas 的/WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml
找到下面配置
p:cookieSecure="false"
p:cookieMaxAge="3600"
(3) 修改 cas 的 WEB-INF/spring-configuration/warnCookieGenerator.xml
找到下面配置
<bean id="warnCookieGenerator"
class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="true"
p:cookieMaxAge="-1"
p:cookieName="CASPRIVACY"
p:cookiePath="/cas" />
咱们这里将 cookieSecure 改成 false , cookieMaxAge 改成 3600
5.单点退出登陆
修改 cas 系统的配置文件 cas-servlet.xml
<bean id="logoutAction" class="org.jasig.cas.web.flow.LogoutAction"
p:servicesManager-ref="servicesManager"
p:followServiceRedirects="${cas.logout.followServiceRedirects:true}"/>
改成 true 后, 能够在退出时跳转页面到目标页面, 修改 home.html 的退出连接
<a href="http://localhost:9000/cas/logout?service=http://www.baidu.com">退出登陆</a>
6.CAS 服务端数据源设置
配置数据源
(1) 修改 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/pinyougoudb?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 tb_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"/>
(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的登陆页面须要更换
(1) 将 项目 的 登 陆 页 login.html 以 及 配 套 的 css 图 片 等 拷 贝 到 cas 系 统 下
WEB-INF\view\jsp\default\ui 目录下
(2) 将原来的 casLoginView.jsp 更名(能够为以后的修改操做作参照),将 login.html 改
名为 casLoginView.jsp
CAS小Demo
1.maven工程pom依赖
<dependencies>
<!-- cas -->
<dependency>
<groupId>org.jasig.cas.client</groupId>
<artifactId>cas-client-core</artifactId>
<version>3.1.12</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>
2.web.xml
<?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</list
ener-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-clas
s>
<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>
<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-c
lass>
<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>
</web-app>
3.测试页面本身随意编写