CAS 单点登录指导文档

1.概述

单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

耶鲁大学(yale)开发的单点登录(Single Sign On)系统称为CAS(Central Authentication Service)被设计成一个独立的Web应用程序(cas.war)。

CAS在2004年12月成为Jasig项目,所以也叫JA-SIG CAS。

本文中服务器版本基于4.0.0版本,对应的客户端版本为3.2.1;

官网:http://jasig.github.io/cas/4.0.0/index.html

2. CAS 原理和协议

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

图 1. CAS 基础协议

CAS Client 与受保护的客户端应用部署在一起,以 Filter 方式保护受保护的资源。对于访问受保护资源的每个 Web 请求,CAS Client 会分析该请求的 Http 请求中是否包含 Service Ticket,如果没有,则说明当前用户尚未登录,于是将请求重定向到指定好的 CAS Server 登录地址,并传递 Service (也就是要访问的目的资源地址),以便登录成功过后转回该地址。用户在第 3 步中输入认证信息,如果登录成功,CAS Server 随机产生一个相当长度、唯一、不可伪造的 Service Ticket,并缓存以待将来验证,之后系统自动重定向到 Service 所在地址,并为客户端浏览器设置一个 Ticket Granted Cookie(TGC),CAS Client 在拿到 Service 和新产生的 Ticket 过后,在第 5,6 步中与 CAS Server 进行身份合适,以确保 Service Ticket 的合法性。

在该协议中,所有与 CAS 的交互均采用 SSL 协议,确保,ST 和 TGC 的安全性。协议工作过程中会有 2 次重定向的过程,但是 CAS Client 与 CAS Server 之间进行 Ticket 验证的过程对于用户是透明的。

另外,CAS 协议中还提供了 Proxy (代理)模式,以适应更加高级、复杂的应用场景,具体介绍可以参考 CAS 官方网站上的相关文档。

3.环境

.Tomcat 7.x 本文中安装目录为: D:\apache-tomcat-7.0.54

.JDK 7 本文中安装目录为: D:\Java\jdk1.7.0_60

. CAS Server版本: cas-server-4.0.0

.CAS Client版本: cas-client-3.2.1

4.配置证书

证书是单点登录认证系统中很重要的一把钥匙,客户端于服务器的交互安全靠的就是证书;本教程由于是演示所以就自己用JDK自带的keytool工具生成证书;如果以后真正在产品环境中使用肯定要去证书提供商去购买,证书认证一般都是由VeriSign认证,中文官方网站:http://www.verisign.com/cn/。

也可以申请免费的StartSSL CA证书: StartSSL(公司名:StartCom)也是一家CA机构,它的根证书很久之前就被一些具有开源背景的浏览器支持(Firefox浏览器、谷歌Chrome浏览器、苹果Safari浏览器等)。 申请地址:http://www.startssl.com 申请方法参考:http://www.linuxidc.com/Linux/2011-11/47478.htm

1> 创建证书

首先创建文件夹:D:/cas/keys用于存放相关的证书文件。

然后打开windows 命令控制台:(开始 --> cmd ->回车)

切换到JDK安装目录中Key: D:\Java\jdk1.7.0_60\jre\bin

输入以下命令:

keytool -genkey -alias mycas -keyalg RSA -keysize 2048 -keystore d:/cas/keys/mycas.keystore

接下来会有提示 如图2:

图2. 创建证书:

此步完成后可在D:/cas/keys文件夹下找到mycas.keystore文件

2>导出证书

输入命令:

keytool -export -file d:/cas/keys/mycas.crt -alias mycas -keystore d:/cas/keys/mycas.keystore

此步完成后可在D:/cas/keys文件夹下找到mycas.crt文件

3>客户端JVM导入证书

在客户端的JDK安装目录下输入命令:

keytool -import -keystore d:\Java\jdk1.7.0_60\jre\lib\security\cacerts -file d:/cas/keys/mycas.crt -alias mycas

其中:d:\Java\jdk1.7.0_60\jre\lib\security\cacerts为客户端JVM的密钥库位置

如果提示:

keytool error: java.io.IOException: Keystore was tampered with, or password was incorrect

那么输入密码:changeit

这是因为JDK安装后会默认创建一个密钥库,密码为:changeit

也可以删除d:\Java\jdk1.7.0_60\jre\lib\security\cacerts 在输入上述命令,如图3

图3. 导入证书:

4>将证书应用到tomcat

打开tomcat目录的conf/server.xml文件,8443端处,并设置keystoreFile、keystorePass修改结果如下:

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"

maxThreads="150" scheme="https" secure="true"

clientAuth="false" sslProtocol="TLS"

keystoreFile="D:/cas/keys/mycas.keystore"

keystorePass="生成KEY的密码"

/>

参数说明:keystoreFile:在第一步创建的key存放位置 keystorePass:创建证书时的密码。

打开https://localhost:8443/,可以测试,如图4:

图4,测试证书

点击“继续浏览此网站(不推荐),现在进入Tomcat目录了吧,如果是那么你又向成功迈进了一步。

5.CAS Server端配置

解压缩cas-server-4.0.0 jar包 ,将modules文件夹下的cas-server-webapp-4.0.0.war拷贝到D:\apache-tomcat-7.0.54\webapps目录下,改名为cas.war(只是为了方便URL输入),并启动Tomcat, 会自动解压得到cas工程文件夹。

好了,现在打开浏览器,输入https://localhost:8443/cas/login ,显示如图5:

图5 .CAS默认登录页面

CAS Server 4.0版本默认采用的username/password 在cas\WEB-INF下的deployerConfigContext.xml中是这样的:

<bean id="primaryAuthenticationHandler"

class="org.jasig.cas.authentication.AcceptUsersAuthenticationHandler">

<property name="users">

<map>

<entry key="casuser" value="Mellon"/>

</map>

</property>

</bean>

输入username: casuser password:Mellon 登录成功,如图6:

图6.CAS 默认登录成功

你成功了吗?如果没有成功请再检查以上步骤!

6.CAS Server 用户认证定制

上面的初体验仅仅是简单的身份验证,实际应用中肯定是要读取数据库的数据,下面我们来进一步配置CAS服务器怎么读取数据库的信息进行身份验证,即cas-server-support-jdbc。

首先,打开D:\apache-tomcat-7.0.54\webapps\cas\WEB-INF\deployerConfigContext.xml,

注释掉默认的用户验证,添加JDBC认证,代码如下:

<!--<bean id="primaryAuthenticationHandler"

class="org.jasig.cas.authentication.AcceptUsersAuthenticationHandler">

<property name="users">

<map>

<entry key="casuser" value="huiquan"/>

</map>

</property>

</bean> -->

<bean id="dataSource"

class="com.mchange.v2.c3p0.ComboPooledDataSource"

p:driverClass="com.mysql.jdbc.Driver"p:jdbcUrl="jdbc:mysql://192.168.0.10:3306/college?useUnicode=true&amp;characterEncoding=UTF-8&amp;zeroDateTimeBehavior=convertToNull"

p:user="root"

p:password="root" />

<!-- 密码加密方式-->

<bean id="passwordEncoder"

class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder"

c:encodingAlgorithm="SHA1"

p:characterEncoding="UTF-8" />

<bean id="dbAuthHandler"

class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"

p:dataSource-ref="dataSource"

p:sql="select password from college.pub_party where partyno=? and partytypecode='0000006' and data_status='1'" />

<!-- p:passwordEncoder-ref="passwordEncoder" --><!-- 暂时不使用密码加密 -->

根据上述配置,我们需要在D:\apache-tomcat-7.0.54\webapps\cas\WEB-INF\lib中加入c3p0-0.9.1.2.jar包、mysql-connector-java-5.1.21.jar包和cas-server-support-jdbc-4.0.0.jar包。

再修改D:\apache-tomcat-7.0.54\webapps\cas\WEB-INF\deployerConfigContext.xml中authentication manager的配置:

<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>

再次运行Tomcat,访问https://localhost:8443/cas/login就能进行数据库验证了。

7.CAS Client 配置

本文中客户端工程部署在同一个Tomcat中,所以CAS Server和Client的域名都为localhost。

在Client工程WEB-INF/lib下添加cas-client-core-3.2.1.jar包。

修改web.xml如下:

<!-- ======================== 单点登录/登出 ======================== -->

<!-- 该过滤器用于实现单点登出功能,可选配置。 -->

<filter>

<filter-name>CAS Single Sign Out Filter</filter-name>

<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>

</filter>

<!-- 该过滤器负责用户的认证工作,必须启用它 -->

<filter>

<filter-name>CAS Authentication Filter</filter-name>

<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>

<init-param>

<param-name>casServerLoginUrl</param-name>

<param-value>https://localhost:8443/cas/login</param-value>

</init-param>

<init-param>

<param-name>serverName</param-name>

<param-value>http://localhost:8080</param-value>

</init-param>

</filter>

<!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->

<filter>

<filter-name>CAS Validation Filter</filter-name>

<filter-class>org.jasig.cas.client.validation.Cas10TicketValidationFilter</filter-class>

<init-param>

<param-name>casServerUrlPrefix</param-name>

<param-value>https://localhost:8443/cas</param-value>

</init-param>

<init-param>

<param-name>serverName</param-name>

<param-value>http://localhost:8080</param-value>

</init-param>

<init-param>

<param-name>redirectAfterValidation</param-name>

<param-value>true</param-value>

</init-param>

</filter>

<!-- 该过滤器负责实现HttpServletRequest请求的包裹,

比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。 -->

<filter>

<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>

<filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>

</filter>

<!-- 该过滤器使得开发者可以通过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 Single Sign Out Filter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

<filter-mapping>

<filter-name>CAS Authentication Filter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

<filter-mapping>

<filter-name>CAS Validation Filter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

<filter-mapping>

<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

<filter-mapping>

<filter-name>CAS Assertion Thread Local Filter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

<listener>

<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>

</listener>

<!-- ======================== 单点登录/登出结束 ======================== -->

根据现在运行Client工程,首次访问任一页面就会跳转到https://localhost:8443/cas/login进行认证。同时,把你的退出链接设置为:https://sso.wsria.com/cas/logout 即可实现单点推出。

8、美化CAS服务器界面

CAS服务端(cas-server)的界面只能在测试的时候用一下,真正系统上线肯定需要定制开发自己的页面,就像网易和CSDN的统一认证平台一样,所有子系统的认证都通过此平台来转接,大家可以根据他们的页面自己定制出适合所属应用或者公司的界面;简单介绍一下吧,复制 cas\WEB-INF\view\jsp\default\ui的一些JSP文件,每一个文件的用途文件名已经区分了,自己修改了替换一下就可以了。 例如:

登录界面:casLoginView.jsp

登录成功:casGenericSuccess.jsp

登出界面:casLogoutView.jsp

9、更新Client端页面跳转配置

完成前面的步骤,并不能得到我们理想的效果。例如,我们的目标是:

Client端index页面 -> CAS Server端login页面 -> 认证成功 -> Client端index页面,并显示欢迎信息。

但由于Client端有自己的登录验证拦截机制,效果却是这样的:

Client端index页面 -> CAS Server端login页面->认证成功 -> Client端login页面。

所以,我需要修改Client端的认证拦截/跳转页面。

前面的步骤以后,我们在Client端的HttpServletRequest中已经可以通过getRemoteUser()方法得到用户名了。

String username = request.getRemoteUser();

再据此修正控制器login页面跳转或拦截器就行了。

结束语

本文只是简单的介绍了CAS的搭建和JDBC认证定制。CAS还提供了多种认证方式:如LADP、legacy、trusted、x.509等等,更多深入的扩展则需要重写AuthenticationHandler的实现等

在此列出一些比较好的相关博文以供参考:

•http://blog.csdn.net/frinder/article/details/7969925

•http://sgq0085.iteye.com/blog/2003190

•http://sgq0085.iteye.com/blog/2099196

•http://www.iteye.com/blogs/tag/cas

CAS 4.0 单点登录教程的更多相关文章

  1. 学习CAS实现SSO单点登录

    学习CAS实现SSO单点登录 网上找了几篇比较详细的教程,在这记录一下: 原理: CAS实现SSO单点登录原理 教程: 1.CAS实现单点登录(SSO)经典完整教程 2.SSO之CAS单点登录实例演示 ...

  2. 七、spring boot 1.5.4 集成shiro+cas,实现单点登录和权限控制

    1.安装cas-server-3.5.2 官网:https://github.com/apereo/cas/releases/tag/v3.5.2 下载地址:cas-server-3.5.2-rele ...

  3. 2、cas4.0 单点登录 之 cas-client

    cas4.0 单点登录 之 cas-client cas4.0 单点登录 之 https证书已经做好了证书的准备工作.如今结合cas-server来配置单点登录: 一.安装cas服务端(cas-ser ...

  4. 实战:ADFS3.0单点登录系列-集成Exchange

    本文将介绍如何将Exchange与ADFS集成,从而实现对于Exchange的SSO. 目录: 实战:ADFS3.0单点登录系列-总览 实战:ADFS3.0单点登录系列-前置准备 实战:ADFS3.0 ...

  5. 一篇文章彻底弄懂CAS实现SSO单点登录原理

    1. CAS 简介 1.1. What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨在为 Web ...

  6. CAS实现SSO单点登录

    环境 cas-server-4.1.8,cas-client-3.4.0,Java-8,Maven-3,Tomcat-7.0.72 CAS Server 安装 点此进入 CAS 下载列表,选择下载 c ...

  7. 采用CAS原理构建单点登录

    企业的信息化过程是一个循序渐进的过程,在企业各个业务网站逐步建设的过程中,根据各种业务信息水平的需要构建了相应的应用系统,由于这些应用系统一般是在不同的时期开发完成的,各应用系统由于功能侧重.设计方法 ...

  8. 实战:ADFS3.0单点登录系列-总览

    本系列将以一个实际项目为背景,介绍如何使用ADFS3.0实现SSO.其中包括SharePoint,MVC,Exchange等应用程序的SSO集成. 整个系列将会由如下几个部分构成: 实战:ADFS3. ...

  9. 实战:ADFS3.0单点登录系列-前置准备

    本文为本系列第二篇,主要分为两部分进行介绍, 一.网络拓扑 二.证书制作 还是将本系列目录贴出来,方便导航 实战:ADFS3.0单点登录系列-总览 实战:ADFS3.0单点登录系列-前置准备 实战:A ...

随机推荐

  1. React Native之携程Moles框架

    因为支持用javascript开发原生应用,React Native一推出就受到不少公司热捧,各家都跃跃欲试.但有一个痛点是,在移动端,我们是否有必要开发多套程序:iOS.Android和H5?本次将 ...

  2. 【Qt编程】Qt学习之Window and Dialog Widgets

    Qt Creator 提供的默认基类只要QMainWindow.QWidget和QDialog三种.其中,QMainWindow是带有菜单栏和工具栏的主窗口类,QDialog是各种对话框的基类,这两个 ...

  3. Linux管理日记(三)

    23. 时间同步 同步时间可以使用 root 执行如下命令完成: rdate -s time.nist.gov 如果需要自动同步,可以采用crontab自动调度,每小时执行一次:  编辑 cronta ...

  4. "《算法导论》之‘字符串’":字符串匹配

    本文主要叙述用于字符串匹配的KMP算法. 阮一峰的博文“字符串匹配的KMP算法"将该算法讲述得非常形象,可参考之. 字符串‘部分匹配值’计算 KMP算法重要的一步在于部分匹配值的计算.模仿& ...

  5. 记——加快gradle 构建速度的经验

    Gradle作为一个新的构建系统,无疑在灵活,扩展,跨平台等各方面都表现得非常优秀,然而,它也有一点备受吐槽,就是速度慢.以下为本人使用gradle过程中,几次加快gradle构建速度的经验之谈. 本 ...

  6. redis持久化AOF与RDB

    RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原 ...

  7. 给大家推荐一个python的学习网站 http://www.codecademy.com

    注册之后,可以跟着指导,自己编码学习,比较方面: 再推荐一个在线编译的代码网站,c/c++ python  都可以: http://codepad.org

  8. 修改win7系统sid

    百度百科定义: Windows使用SID来表示所有的安全对象(security principals).安全对象包括主机,域计算机账户,用户和安全组.名字Name是用来代表SID的一个方法,可以允许用 ...

  9. Spring Boot 多模块与 Maven 私有仓库

    前言 系统复杂了,抽离单一职责的模块几乎是必须的:若需维护多个项目,抽离公用包上传私有仓库管理也几乎是必须的.其优点无需赘述,以下将记录操作过程. 1. 多模块拆分 在.NET 中由于其统一性,实现上 ...

  10. JQuery系统梳理

    JQuery在前端网页开发中可以说是非常常用了,它所拥有的强大功能足以让我们完成各式各样的效果. 一.JQuery基础语法 1. 使用JQuery必须先导入jquery.x.x.x.js文件: 2. ...