您的位置:首页 > 其它

CAS实现SSO(单点登录)

2014-04-15 20:52 459 查看
我的理解:
总体思想:
CAS Server中存放着用户登录信息(用户名、密码,存放在一个随机产生的Service Ticket中),然后用户访问系统的时候,即访问CAS Client的时候(需要保护的系统和CAS Client是部署在一起的),就对比在CAS Server中有没有这个用户,即身份的核实。

所以最主要的就是在CAS Server中创建Service Ticket(这个创建过程需要首先验证用户的合法性,如果用户信息不正确,如密码错误,则直接显示错误信息给用户;用户验证通过后,才会创建这个Service Ticket,并把Service Ticket返回给CAS Client),然后对比CAS Client和CAS Server中的Service Ticket是否相同。相同则表示已经登录,可以继续访问其他系统。不相同则表示已经过期。

其实和单一系统登录的唯一区别就是:

单点登录的用户登录信息需要多次验证,而这个验证过程我们不用用户区处理,而是通过CAS Server去处理,即登录一次后便产生一个Service Ticket,一票通行,以后每次需要验证(登录其他子系统)的时候,都只需要对比CAS Client和CAS Server中的Service Ticket是否相同。

所以,详细说来,主要有以下步骤:

第一种情况:首次登录

这个时候,CAS Server中还没有创建Service Ticket,所以CAS Client中肯定没有Service Ticket,所以这个时候就需要首先创建Service Ticket。即下图中的step1、2、3、4。

第二种情况:访问子系统

这个时候,CAS Server中已经创建了Service Ticket,所以CAS Client中肯定Service Ticket,这个时候只需要对比CAS Client和CAS Server中的Service Ticket是否相同。即下图中的step5、6。

1.引言

1.1 编写目的

记录使用CAS实现SSO的过程。

1.2 术语定义

CAS: 全称JA-SIG Central Authentication Service,实现SSO的开源项目。

SSO: 即Single sign on,单点登录

1.3 所需安装文件清单

密钥库文件: cas.com.keystore(此文件包已经在安装包中提供,用户可以根据制作服务器安全证书环节描述自行生成)

密钥证书: case.com.crt(此文件包已经在安装包中提供,用户可根据制作服务器安全证书环节描述自行生成)。

CAS服务安装包:cas.war

1.4 软件环境

JDK1.5+

Tomcat6.x(之前配置用版本5的没有成功,后来换成6的就可以了)

WindowsXP

MySQL5+

2.概述

2.1 背景

单点登录(Single Sign On,简称SSO)是目前比较流行的服务于企业业务整合的解决方案之一,SSO使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。CAS(Central Authentication Service)是一款不错的针对Web应用的单点登录框架,这里就说说使用CAS实现SSO的方式。

2.2CAS原理和协议

单点登录的原理是通过拦截你设定的URL,并跳转到你指定的CAS Server登录页,当你登录成功后,呆着Ticket,返回到你打开的URL.然后你就可以一票在手,畅通无阻。

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



CAS Client 与受保护的客户端应用部署在一起,以Filter方式保护 Web 应用的受保护资源,过滤从客户端过来的每一个Web 请求,同时, CAS
Client会分析HTTP 请求中是否包请求 Service Ticket( 上图中的 Ticket) ,如果没有,则说明该用户是没有经过认证的,于是,CAS
Client会重定向用户请求到CAS Server( Step 2 )。 Step 3是用户认证过程,如果用户提供了正确的Credentials, CAS
Server 会产生一个随机的 Service Ticket ,然后,缓存该 Ticket ,并且重定向用户到CAS Client(附带刚才产生的Service
Ticket), Service Ticket 是不可以伪造的,最后, Step 5 和 Step6是 CAS
Client 和 CAS Server之间完成了一个对用户的身份核实,用Ticket查到 Username ,因为 Ticket是 CAS
Server 产生的,因此,所以 CAS Server 的判断是毋庸置疑的。

该协议完成了一个很简单的任务,所有与CAS的交互均采用SSL协议,确保ST和TGC的安全性。协议工作过程会有2此重定向过程,但是CAS Client与CAS Server之间进行ticket验证的过程对于用户是透明的。

3.安装步骤

3.1系统环境安装

3.1.1 JDK安装

配置环境变量: JAVA_HOME=c:\Program File\Java\jdk1.6.0_06

Path=%JAVA_HOME\bin

CALSS=.;%JAVA_HOME\lib\tools.jar;%JAVA_HOME\lib\dt.jar

3.1.2MySQL安装

MySQL安装,建库和建一张users表,包含account,password字段,数据自行建立。

注意:如果password是采用MD5加密,表中password字段数据相应也应是MD5加密。

3.1.3 Tomcat安装

Tomcat的安装需要注意,安装路径中不能有空格存在。

3.1.4 SSL安全连接配置

集中操作维护需要用到SSL安全连接,其中women需要配置Tomcat的8443端口(如用Oracle,则Tomcat为7443或6443端口,端口与必须以443结尾)

3.1.4.1 制作服务器安全证书

keytool为JDK自带的证书管理工具,我们使用keytool进行证书的生成以及管理,详细步骤如下:

生成一对密钥并存储在密钥库里:打开命令行窗口执行命令keytool -genkey -alias cas.com -keyalg RSA -keystore cas.com.keystore,命令执行成功,屏显信息类似下面表格中内容.

*-genkey参数为生成一对密钥

*-alias为此密钥对命名别名,这个需要记住,下一步到处证书的时候需要这个是一项必要参数(即要说明从哪个密钥库里导出证书)。

*-keyalg RSA指的是采用RSA算法

*-keystore是指生成的证书存储的位置

*密码输入后会让你输入一些其他信息,记得这里第一个姓名必须是服务器的域名或者完整的计算机名称。

*其中的-dname即为证书的唯一名称,选项中的cn参数为CAS服务器所在机器的域名或计算机名,CAS建议不要使用IP名,这个很重要,我们这里sso.cas.com,那么在集成了CAS服务的系统中需要添加一条域名与IP的映射信息,剩余ou/o/c分别为单位/组织/国家信息,根据实际情况填写即可。

*-keypass为证书密码;-keystore为密钥库文件名;-storepass为密钥库的密码;validity为此证书有效期。

c:\admin>keytool -genkey -dname "cn=sso.cas.com,ou=cas,o=cas,c=CN" -alias cas.com -keypass 123456 -keystore cas.com.keystore -storepass 123456 -validity 180

c:\admin>dir \find "cas.com.keystore"

2011-12-21 18:32 1173 cas.com.keystore

命令执行成功后将在当前目录生成cas.com.keystore文件,参见上方表格中得内容。

如果未能执行成功,可能是JDK环境变量配置不正确。

导出证书,在港口的命令窗口执行如下命令

*-export 就是说明要到处证书。

*-file 是指明要从哪个密钥库里导出,我们这里配置刚才在上一步生成的cas.com.keystore文件。

*-storepass即为我们上步中填写的-storepass 这里为123456

*-alias为此证书的别名

c:\admin>keytool -export -file cas.com.crt -keystore cas.com.keystore -storepass 123456 -alias cas.com

保存在文件中的认证<cas.com.crt>

为客户端的JVM导入密钥

c:\admin>keytool -import -file cas.com.crt -alias cas.com.keystore c:/Program Files/Java/jdk1.6.0_06/jre/lib/security/cacerts

输入密码: changeit ,这个是默认密码。

特别说明这个JDK路径是指的JDK的JRE路径下的lib目录。

如果有产生不需要的证书导入到了cacerts,可以删除该证书

c:\admin>keytool -delete -alias cas.com -keystore cacerts

3.1.4.2配置HOST c:/windows/system32/drivers/etc/hosts

127.0.0.1 cas.com.keystore

3.1.4.3 修改tomcat配置文件:/conf/server.xml

<!-- Define a SSL HTTP/1.1 Connector on port 8443 -->

<Connector SSLEnabled="true" clientauth="false" keystoreFile="conf/cas.com.keystore" keystorePass="123456" maxThreads="150"

port="8443" protocol="HTTP/1.1" scheme="https" secure="true" sslProtocol="TLS" />

3.2配置CAS Server

CAS Server是一个web应用包,部署在web服务器上,负责完成对用户的认证工作,另外由于Client与CAS Server之间的交互采用Https协议,因此部署CAS Server的服务器还需要支持SSL协议。当SSL配置成功过后,像普通web应用一样将CAS Server部署在服务器上就能正常运行了。

CAS Server会处理用户名/密码等凭证(Credentials),它可能会倒数据库检索一条用户账号信息,也可能在XML文件中检索用户密码,CAS均提供一种灵活但统一的接口/实现分离方式,CAS究竟用何种认证方式,跟CAS协议是分离的,也就是,这个认证的实现细节可以自己定制和扩展。

3.2.1 配置CAS Server环境

#将CA证书,即cas.com.keystore文件拷贝到%tomcat5%/conf目录下

#CAS Server部署依赖包cas-server-core-3.4.7.jar cas-server-support-jdbc-3.4.7.jar

#配置CAS验证数据库,即配置/cas/Webcontent/WEB-INF/deployerConfigcontext.xml这个文件。

#其中需要修改的内容 select password from users where account=? , users /password/account请分别填写实际的用户表和用户密码以及登录用户名字段。

#当采用MD5进行加密,数据库中的用户密码字段一定要是MD5进行过的,否则会登录错误。

下载cas-server-3.3\modules,复制cas-server-webapp-3.3.war到tomcat\webapps瞎,修改名称为cas.war,然后启动IE,输入http://localhost:8080/cas 检验是否可以访问,如果可以,则输入相通的用户名和密码,测试是否可以登录。

<bean id="authenticationManager" class="org.jasig.cas.authentication.AuthenticationManagerImpl">

<property name="credentialsToPrincipalResolvers">

<list>

<bean class="org.jasig.cas.authentication.principal.UsernamePasswordCredentialsToPrincipalResolver"/>

<bean class="org.jasig.cas.authentication.principal.HttpBasedServiceCredentialsToPrincipalResolver"/>

</list>

</property>

<property name="authenticationHandlers">

<list>

<bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler" p:httpClient-ref="httpClient"/>

<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">

<property name="sql" value="select password from users where account=?"/><!--根据实际情况修改 -->

<property name="dataSource" ref="dataSource"/>

<property name="passwordEncoder" ref="MD5passwordEncoder"/>

</bean>

</list>

</property>

</bean>

<!--根据实际情况配置 -->

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>

<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/>

<property name="username" value="uname"/>

<property name="password" value="upassword"/>

</bean>

<bean id="MD5passwordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordencoder">

<constructor-arg index="0">

<value>MD5</value>

</constructor-arg>

</bean>

到 CAS 官方网站下载 CAS Server 和 Client,地址分别为:

http://www.ja-sig.org/downloads/cas/cas-server-3.1.1-release.zip

将CAS Server发布包拷贝到%tomcat%/webapps/目录下。

由于前面已配置好tomcat的https协议,可以重新启动tomcat,然后访问 https://localhost:8443/sso(工程名)
如果能出现工程登录页面,则说明CAS Server已经部署成功。

3.2.2 CAS Client部署

CAS Client负责部署在客户端(web应用),原则上,CAS Client的部署意味着,当有对本地web应用的受保护资源的访问请求,并且需要对请求方进行身份验证,web应用不再接受任何的用户密码等类似的Credentials,而是重定向到CAS Server进行认证。

CAS Client以Filter方式保护web应用的受保护资源,过滤从客户端过来的每一个web请求,同时,CAS Client会分析HTTP请求中是否包请求Service Ticket,如果没有,则说明该用户是没有经过认证的。于是,CAS Client会重定向用户请求到CAS Server.如果用户提供了正确的Credentials , CAS Server会产生一个随机的Service Ticket,然后,缓存该Ticket,并且重定向用户到CAS
Client(附带刚才产生的Service Ticket),Service Ticket是不可伪造的,最后是CAS Client和CAS Server之间完成了一个对用户的身份核实,用Ticket查到username,因为Ticket是CAS Server产生的,所以CAS Server的判断是毋庸置疑的。

单点登录的母的是为了让多个相关联的应用使用相同的登录过程,本过程中在eclipse 中构造2个简单的web工程。分别以castest1和castest2来作为实力,他们均只有一个页面,显示欢迎信息即可。通过本文的配置,实现单点登录,即只需登录一次就可以访问这两个应用。

在Eclipse建立的客户端工程中加入 casclient.jar和cas-client-core-3.2.0.jar.修改web.xml文件,添加CAS Filter。 如清单所示:

<web-app>

...

<filter>

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

<filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>

<init-param>

<param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>

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

</init-param>

<init-param>

<param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>

<param-value>https://cas.com.keystore:8443/cas/serviceValidate</param-value>

</init-param>

<init-param>

<param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>

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

</init-param>

</filter>

<filter-mapping>

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

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

</filter-mapping>

<welcome-file-list>

<welcome-file>index.jsp</welcome-file>

</welcome-file-list>

...

</web-app>

# edu.yale.its.tp.cas.client.filter.loginUrl 指定CAS提供登录页面的URL

#edu.yale.its.tp.cas.client.filter.validateUrl 指定CAS提供service ticket或proxy ticket验证服务的URL

#edu.yale.its.tp.cas.client.filter.serverName 指定客户端的域名和端口,是指客户端应用所在机器而不是CAS Server所在机器

在上面配置结束后,启动tomcat

#验证服务器端

打开浏览器,访问https://localhost:8443/sso ,浏览器会弹出服务端登录页,登录后即转到登录页面。

#验证客户端

打开浏览器,访问http://localhost/casetest1,浏览器会弹出安全提示,接收后即转到SSO登录页面,登录成功后,再定向到casetest1的首页面,可以看到地址栏里的地址多出了一个ticket参数,这就是CAS分配给当前应用的ST(Service
Ticket);

再在同一个窗口打开浏览器,访问http://localhost/casetest2,浏览器会弹出安全提示,接受后即转到SSO登录页面,登录成功后,再定向到casetest2的首页面。之后再在地址栏重新输入http://localhost/casetest1,会直接显示
casetest1的页面而无需再次登录。

结束语

本文档介绍了CAS单点登录解决方案的原理,并结合实例讲解了在tomcat中使用CAS的配置、部署方法和效果,CAS是作为开源单点登录解决方案的一个不错的选择,更多使用细节可以参考CAS官方网站。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: