一. 什么是单点登录
单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。当我们的系统存在诸多子系统,而这些子系统是分别部署在不同的服务器中,那么使用传统方式的 session 是无法解决的,我们需要使用相关的单点登录技术来解决。
二. 什么是 CAS
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 等。
从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。下图是 CAS 最基本的协议过程:
SSO 单点登录访问流程主要有以下步骤:
- 访问服务:SSO 客户端发送请求访问应用系统提供的服务资源。
- 定向认证:SSO 客户端会重定向用户请求到 SSO 服务器。
- 用户认证:用户身份认证。
- 发放票据:SSO 服务器会产生一个随机的 Service Ticket。
- 验证票据:SSO 服务器验证票据 Service Ticket 的合法性,验证通过后,允许客户端访问服务。
- 传输用户信息:SSO 服务器验证票据通过后,传输用户认证结果信息给客户端。
三. CAS 服务端部署
1. 下载一个纯净的 Tomcat 服务器, 下载地址: https://pan.baidu.com/s/1YY3o6qno1DuR7oxwgMkdEQ
2. 下载 cas.war 服务端, 下载地址: https://pan.baidu.com/s/1w7Y1d3Tr0P0MBlGvRcLVTg
3. 将下载好的 Tomcat 服务器解压到没有中文没有空格的文件目录下, 再将下载好的 cas.war 服务端剪切到 Tomcat 的 webapps 目录下, 启动 Tomcat 中 bin 目录下的 , 将自动解压 cas.war 包.
4. 浏览器输入 http://localhost:8080/cas/login 可以进入到如下页面:
四. CAS 服务端配置
1. 修改端口号
A. 修改 Tomcat 的端口号
打开 Tomcat 目录 conf\server.xml 找到下面的配置 (Tomcat 初始号端口号为 8080, 将其修改为其他端口号, 如 9100)
B. 修改 cas 配置文件
修改解压后 cas 的 WEB-INF/cas.properties:
2. 去除 https 认证
CAS 默认使用的是 HTTPS 协议,如果使用 HTTPS 协议需要 SSL 安全证书(需向特定的机构申请和购买) 。如果对安全要求不高或是在开发测试阶段,可使用 HTTP 协议。我们这里讲解通过修改配置,让 CAS 使用 HTTP 协议。
A. 修改 cas 的 WEB-INF/deployerConfigContext.xml
这里需要修改参数 p:requireSecure="false",默认为 true, requireSecure 属性意思为是否需要安全验证,即 HTTPS,false 为不采用
B. 修改 cas 的 WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml
参数默认 p:cookieSecure="true",同理为 HTTPS 验证相关,TRUE 为采用 HTTPS 验证,FALSE 为不采用 https 验证。
参数默认 p:cookieMaxAge="-1",是 COOKIE 的最大生命周期,-1 为无生命周期,即只在当前打开的窗口有效,关闭或重新打开其它窗口,仍会要求验证。可以根据需要修改为大于 0 的数字,比如 3600 等,意思是在 3600 秒内,打开任意窗口,都不需要验证。 我们这里将 cookieSecure 改为 false , cookieMaxAge 改为 3600。
C. 修改 cas 的 WEB-INF/spring-configuration/warnCookieGenerator.xml:
我们这里将 cookieSecure 改为 false , cookieMaxAge 改为 3600。
5. 用户名登录
在 cas 服务端中 web-inf 下 deployerConfigContext.xml 文件中:
<!-- 选择登录用户数据源 -->
<constructor-arg>
<map>
<entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
<entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />
</map>
</constructor-arg>
以上 key-ref="primaryAuthenticationHandler" 表示使用静态用户名密码的配置登录, 要想使用数据库中的用户名和密码登录将值修改为 "dbAuthHandler"
<!-- 静态用户名密码配置 -->
<bean id="primaryAuthenticationHandler" class="org.jasig.cas.authentication.AcceptUsersAuthenticationHandler">
<property name="users">
<map>
<entry key="admin" value="admin"/>
</map>
</property>
</bean>
<!-- 数据库登录用户数据源配置 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
p:driverClass="com.mysql.jdbc.Driver"
p:jdbcUrl="jdbc:mysql://127.0.0.1:3306/登录用户表所在的数据库名?characterEncoding=utf8"
p:user="root"
p:password="root" />
<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 密码 from 表名 where 用户名 = ?"
p:passwordEncoder-ref="passwordEncoder"/>
导入数据库连接池依赖包, 下载地址: https://pan.baidu.com/s/13diIxLe9shgliXF-TQfynQ
将解压后的 三个依赖包 剪切到 cas 的webapps\cas\WEB-INF\lib 下.
选择好用户登录数据源后, 再次使用新的端口号登录, 即可登录到成功页面:
六. 登录用户退出
浏览器地址栏输入: http://localhost:9100/cas/logout
即可看到退出后的提示页面: