单点登录的原理与CAS技术的研究
1.什么是单点登录?
关于单点登录技术的说明参考文章:http://www.cnblogs.com/yupeng/archive/2012/05/24/2517317.html
一般来说,整个原理大家都比较认可。下一步需要关注的是使用什么技术来实现单点登陆。
2.选择什么技术实现单点登录?
经过比较最终选择使用CAS:http://www.oschina.net/p/ja-sig+cas
3.CAS技术研究
3.1CAS下载
CAS分为Server端和client端:
官网地址:https://www.apereo.org/cas
Server端的下载地址:https://www.apereo.org/cas/download
Client端的下载地址:http://downloads.jasig.org/cas-clients/
至于版本选择:Server端选择4.0,Client选择最新版本3.3.3
3.2 CAS服务器安装
现在把Server端和Client端的包下载完成之后,开始进行Server端的服务器搭建。
1.准备工作
1.在你的安装环境中安装tomcat(jdk就不说了肯定要提前装好的)。
2.在环境变量中设置Path=path;%JAVAHOME%/bin,保证能够运行keytool命令,后面要用到。

3.为了简单测试,在cmd命令窗口中进入tomcat目录。
2.创建密钥库
使用 JDK 的 keytool 命令生成密钥库(keystore),其实就是一份 keystore 文件,keystore 必须通过密码才能访问。
keystore 里包含了多个密钥对(keypair),每个 keypair 都有一个别名(alias),alias 必须保证唯一性,而且都有一个密码,有此可知,keystore 与 keypair 都有自己的密码。
JDK 也有自己的 keystore,位于 %JAVA_HOME%\jre\lib\security\cacerts,其密码就是 changeit,当然也可以通过 keytool 命令来修改。
我们首先生成 keypair 及其存放 keypair 的 keystore,然后从 keystore 里导出证书,最后将证书导入 JDK 的 keystore 里,Tomcat 在运行时就会自动读取 JDK 的 keystore,以确保所部署的应用可以享受 HTTPS 协议(SSL 通道)带来的安全性。
2.1生成 keypair
参考命令
keytool -genkey –alias -keyalg RSA -keystore tomcatstore

- -genkey 生成一个证书的密钥
- -alias 证书别名
- -keyalg 指定证书的密钥算法
- -keystore 指定证书库的名称
注意:
为了简化操作,建议 keystore 与 keypair 的密码相同,且均为 abc123。
提示“您的名字与姓氏是什么?”,这里需要输入一个域名,如果没有域名,测试可用localhost,但是注意一定不能使用ip地址。
成功之后,会在tomcat目录中生成:

2.2从 keystore 中导出证书
参考命令:
keytool -export -file tomcat.cer -alias tomcat -keystore teststore -storepass abc123
可双击该证书文件,将该证书安装到“受信任的根证书颁发机构”中,这样在浏览器中使用 HTTPS 协议访问时才不会出现一个红色的叉叉。
完成命令之后会在tomcat目录中生成:

2.3 导入证书到 JVM 中
参考命令:
keytool -import -keystore "%JAVA_HOME%\jre\lib\security\cacerts" -file tomcat.cer -alias tomat -storepass changeit
默认情况下,Tomcat 将读取 JVM 中的密钥库,而不是用户目录下的 .keystore 密钥库,当然也可以配置 Tomcat 使其读取指定的密钥库。
3使 Tomcat 支持 HTTPS
1.这里把刚才生成的keystore文件(teststore)复制到%CATALINA_HOME%\conf目录下
2.修改server.conf文件
<Connector SSLEnabled="true" clientAuth="false" keystoreFile="teststore" keystorePass="abc123" maxThreads="150" port="8443" protocol="org.apache.coyote.http11.Http11Protocol" scheme="https" secure="true" sslProtocol="TLS"/>
注意事项:
1.原有的8080端口的connector不变,需要被注释掉的8443端口变成可用,然后在其基础上修改。
2.protocol不能是“HTTP/1.1”
5 运行 CAS 服务器
启动tomcat,在浏览器中输入:
https://localhost:8443/cas-server-webapp-4.0.0

4.0版的默认用户名密码是:casuser/Mellon,输入之后:

退出:

3.3CAS服务器深入配置
上面的初体验仅仅是简单的身份验证,实际应用中肯定是要读取数据库的数据,下面我们来进一步配置CAS服务器怎么读取数据库的信息进行身份验证。 首先打开
tomcat/webapp/cas/WEB-INF/deployerConfigContext.xml
注释掉:
在后面添加:
修改authenticationManager中的配置【dbAuthHandler】部分:

在apache-tomcat-7.0.54\webapps\cas-server-webapp-4.0.0\WEB-INF\lib中添加jar包:
1.cas-server-support-jdbc-4.0.0.jar
2.c3p0-0.9.1.2.jar
3.ojdbc6-11.2.0.3.jar
此时可以连接oracle进行密码验证了。
注意:
1.使用了MD5验证,也就是数据库中存储MD5加密后的密码。
2.dataSource使用c3p0的配置。
3.主要要建好对应的表结构。
3.3CAS客户端配置
新建一个普通的web工程,其中:
1.在Client工程WEB-INF/lib下添加cas-client-core-3.3.3.jar包,注意把其他的依赖包全部加上。
2.修改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-server-webapp-4.0.0/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-server-webapp-4.0.0</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>
<!-- ======================== 单点登录/登出结束 ======================== -->
注意:
1.4.0的配置跟老版本的不一致。
2.server中的地址最好使用域名,如果没有域名,可以使用localhost。
输入:localhost:8080/firstclient,转向到验证页面。

输入用户名,密码之后,进入firstclient的页面。

按照相同的配置配置secondclient,在firstclient登录之后,直接输入:localhost:8080/secondclient,不需要登录可以直接进入:

参考文档:
http://www.kafeitu.me/sso/2010/11/05/sso-cas-full-course.html
http://my.oschina.net/huangyong/blog/198109
http://my.oschina.net/aiguozhe/blog/160934
http://www.ibm.com/developerworks/cn/opensource/os-cn-cas/
http://blog.csdn.net/kissliux/article/details/17674443
http://alexwangjie.iteye.com/blog/2117552
http://blog.csdn.net/xuke6677/article/details/38845671
单点登录的原理与CAS技术的研究的更多相关文章
- SSO单点登录实现原理与总结
一.什么是单点登录SSO(Single Sign-On) SSO是一种统一认证和授权机制,指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用 ...
- cas 单点登录出现org.jasig.cas.client.util.CommonUtils.getResponseFromServer - 拒绝连接 Connection refused
cas 单点登录出现org.jasig.cas.client.util.CommonUtils.getResponseFromServer - 拒绝连接 Connection refused 环境: ...
- portal单点登录的原理与实现还有ESB
portal单点登录的原理与实现还有ESB 在毕业论文中有描述到这一点.我给我出的截图
- [置顶] SSO单点登录系列6:cas单点登录防止登出退出后刷新后退ticket失效报500错
这个问题之前就发现过,最近有几个哥们一直在问我这个怎么搞,我手上在做另一个项目,cas就暂时搁浅了几周.现在我们来一起改一下你的应用(client2/3)的web.xml来解决这个2b问题,首先看下错 ...
- 浅析C#中单点登录的原理和使用
什么是单点登录?我想肯定有一部分人"望文生义"的认为一个用户只能在一处登录.其实这是错误的理解(我记得我第一次也是这么理解的).单点登录指的是多个子系统只需要登录一个,其他系统不需 ...
- 单点登录(五)-----遇到问题-----cas server 源码部署tomcat运行报错BeanCreationException:Error creating bean with name 's
我们在上一篇文章已经解决了把下载好的cas server源码部署到tomcat缺少子项目编辑文件或者jar包导致找不到class报错的问题 单点登录(四)-----遇到问题-----cas serve ...
- 单点登录(四)-----遇到问题-----cas server 源码部署tomcat运行报错ClassNotFoundException: org.jasig.cas.CasEnvironmentCo
情况 cas单点登录 cas server 源码部署tomcat运行报错 把cas server的代码下载下来后使用gradle插件或者maven插件以及转化成eclipse·后导入发现部署到tomc ...
- SSO单点登录实现原理
SSO单点登录实现原理 只是简要介绍下基于java的实现过程,不提供完整源码,明白了原理,我相信你们可以自己实现.sso采用客户端/服务端架构,我们先看sso-client与sso-server要实现 ...
- CAS单点登录实践(spring cas client配置)
前言: 最近的项目需要将多个站点统一登录,查阅了资料Jasig cas(Central Authentication Service)(官方站点:http://www.jasig.org/cas)使用 ...
随机推荐
- 设置field的背景颜色以及对stylesheet的理解
今天遇到一个需求:在做页面输入验证的时候,如果用户没有输入某个项,那么这个项显示为红色,一直没头绪,也找peoplebook,发现field有一个style的方法,后来又在谷歌上找,终于找到了方法: ...
- IOS学习3
@property属性使用 copy:NSString strong: 一般对象 weak: UI空间 assign:基本数据类型 retain: (对象,先上述类型使用) id 万能指针. id缺点 ...
- [.ashx檔?泛型处理例程?]基础入门#1....能否用中文教会我?别说火星文?
原文出處 http://www.dotblogs.com.tw/mis2000lab/archive/2013/08/20/ashx_beginner_01.aspx [.ashx檔?泛型处理例程? ...
- Oracle 直方图实例测试
--创建表 SQL> create table tab (a number, b number); Table created. --插入数据 SQL> begin .. loop ins ...
- 第六节:宿主如何使用AppDomain
前面已经讨论了宿主以及宿主加载CLR的方式.同时还讨论了宿主如何告诉CLR创建和卸载AppDomain.为了使这些讨论更加具体,下面将描述一些常见的宿主和AppDomain使用情形.特别地,我要解释不 ...
- opensuse 安装 Anaconda3 之后出现Could not start d-bus. Can you call qdbus?
最近在安装了opensue Leap42.1之后,想要学习一下python,就安装了Anaconda3,并且将Anaconda3的安装路径添加到了PATH里,但是在重新启动系统后,出现了"C ...
- Python-Day12 Python mysql and ORM
一.Mysql数据库 1.什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库, 每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据 ...
- python 遍历文件夹
import os import os.path rootdir = “d:\data” # 指明被遍历的文件夹 for parent,dirnames,filenames in os.walk(ro ...
- 【转】Oracle中如何用一条SQL快速生成10万条测试数据
转自http://blog.csdn.net/welken/article/details/4971887 做数据库开发或管理的人经常要创建大量的测试数据,动不动就需要上万条,如果一条一条的录入, ...
- golang处理错误的艺术
golang中关键API的调用都会在最后返回err(golang多值返回). 调用者可以选择处理, 或者不处理该err, 或原装返回给上一层的调用者. golang中的err是error类型, typ ...

