CAS单点登录(SSO)完整教程
2015-10-29 14:13
537 查看
CAS单点登录(SSO)完整教程
![](http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif)
转载▼
教程目的:从头到尾细细道来单点登录服务器及客户端应用的每个步骤
单点登录(SSO):请看百科解释猛击这里打开
本教程使用的SSO服务器是Yelu大学研发的CAS(Central Authentication Server),
官网:http://www.jasig.org/cas
本教程环境:
Tomcat6.0.29JDK6
CAS Server版本:cas-server-3.4.3.1、cas-server-3.4.10
CAS Client版本:cas-client-3.1.12、cas-client-3.2.1
首先配置证书、SSL等 参考
http://blog.sina.com.cn/s/blog_8020e4110101azsx.html
六、CAS服务器初体验
CAS服务端下载:http://www.jasig.org/cas/download下载完成后将cas-server-3.4.3.1.zip解压,解压cas-server-3.4.3/modules/cas-server-webapp-3.4.3.1.war,改名为cas,然后复制cas目录到你的tomcat/webapp目录下
现在可以访问CAS应用了,当然要使用HTTPS加密协议访问,
例如本教程地址:https://sso.wsria.com:8443/cas/login ,现在打开了CAS服务器的页面输入admin/admin点击登录(CAS默认的验证规则只要用户名和密码相同就通过)
如果没有成功请再检查以上步骤!
七、CAS服务器深入配置
上面的初体验仅仅是简单的身份验证,实际应用中肯定是要读取数据库的数据,下面我们来进一步配置CAS服务器怎么读取数据库的信息进行身份验证。首先打开tomcat/webapp/cas/WEB-INF/deployerConfigContext.xml文件,配置的地方如下:
找到第92行处,注释掉:SimpleTestUsernamePasswordAuthenticationHandler这个验证Handler,这个是比较简单的,只是判断用户名和密码相同即可通过,这个肯定不能在实际应用中使用,弃用!
注释掉92行后在下面添加下面的代码:
Xml代码 " quality="high" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer">
![](http://ttaale.iteye.com/images/icon_star.png)
<</span>bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
<</span>property name="dataSource" ref="dataSource" />
<</span>property name="sql" value="select password from t_admin_user where login_name=?" />
<</span>property name="passwordEncoder" ref="MD5PasswordEncoder"/>
</</span>bean>
在文件的末尾之前加入如下代码:
Xml代码 com.mysql.jdbc.Driver jdbc:mysql:///wsriademo root root MD5 " quality="high" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer">
![](http://ttaale.iteye.com/images/icon_star.png)
<</span>bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<</span>property name="driverClassName"><</span>value>com.mysql.jdbc.Driver</</span>value></</span>property>
<</span>property name="url"><</span>value>jdbc:mysql:///wsriademo</</span>value></</span>property>
<</span>property name="username"><</span>value>root</</span>value></</span>property>
<</span>property name="password"><</span>value>root</</span>value></</span>property>
</</span>bean>
<</span>bean id="MD5PasswordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">
<</span>constructor-arg index="0">
<</span>value>MD5</</span>value>
</</span>constructor-arg>
</</span>bean>
复制cas-server-3.4.3.1\modules\cas-server-support-jdbc-3.4.3.1.jar和mysql驱动jar包到tomcat/webapp/cas/WEB-INF/lib目录
配置解释:
QueryDatabaseAuthenticationHandler 是cas-server-support-jdbc提供的查询接口其中一个,QueryDatabaseAuthenticationHandler是通过配置一个 SQL 语句查出密码,与所给密码匹配
dataSource 我就不用解释了吧,就是使用JDBC查询时的数据源
sql 语句就是查询哪一张表,本例根据t_admin_user表的login_name字段查询密码,CAS会匹配用户输入的密码,如果匹配则通过;下面是t_admin_user的表结构:
Sql代码
![](http://ttaale.iteye.com/images/icon_star.png)
CREATE TABLE t_admin_user (
id BIGINT NOT NULL AUTO_INCREMENT,
email VARCHAR(255),
login_name VARCHAR(255) NOT NULL UNIQUE,
name VARCHAR(255),
password VARCHAR(255),
PRIMARY KEY (id)
) ENGINE=InnoDB;
passwordEncoder ,这个就算是自己加的盐巴了,意思很明显就是处理密码的加密,看你的应用中数 据库保存的是明码还是加密过的,比如本例是使用MD5加密的,所以配置了MD5PasswordEncoder这个Handler,cas内置了MD5的 功能所以只需要配置一下就可以了;如果在实际应用中使用的是公司自己的加密算法那么就需要自己写一个Handler来处理密码,实现方式也比较简单,创建 一个类继承org.jasig.cas.authentication.handler.PasswordEncoder然后在encode方法中加密用
户输入的密码然后返回即可
八、配置CAS客户端
添加cas-client的jar包 ,有两种方式:传统型 :下载cas-client,地址:http://www.ja-sig.org/downloads/cas-clients/ ,然后解压cas-client-3.1.12.zip,在modules文件夹中有需要的jar包,请根据自己的项目情况选择使用
Maven 型 :
Xml代码
![](http://ttaale.iteye.com/images/icon_star.png)
<</span>dependency>
<</span>groupId>org.jasig.cas.client</</span>groupId>
<</span>artifactId>cas-client-core</</span>artifactId>
<</span>version>3.1.12</</span>version>
</</span>dependency>
设置filter
先上配置信息:
Xml代码
![](http://ttaale.iteye.com/images/icon_star.png)
<</span>listener>
<</span>listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</</span>listener-class>
</</span>listener>
<</span>filter>
<</span>filter-name>CAS Single Sign Out Filter</</span>filter-name>
<</span>filter-class>org.jasig.cas.client.session.SingleSignOutFilter</</span>filter-class>
</</span>filter>
<</span>filter-mapping>
<</span>filter-name>CAS Single Sign Out Filter</</span>filter-name>
<</span>url-pattern>/*</</span>url-pattern>
</</span>filter-mapping>
<</span>filter>
<</span>filter-name>CASFilter</</span>filter-name>
<</span>filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</</span>filter-class>
<</span>init-param>
<</span>param-name>casServerLoginUrl</</span>param-name>
<</span>param-value>https://sso.wsria.com:8443/cas/login</</span>param-value>
</</span>init-param>
<</span>init-param>
<</span>param-name>serverName</</span>param-name>
<</span>param-value>http://localhost:10000</</span>param-value>
</</span>init-param>
</</span>filter>
<</span>filter-mapping>
<</span>filter-name>CASFilter</</span>filter-name>
<</span>url-pattern>/*</</span>url-pattern>
</</span>filter-mapping>
<</span>filter>
<</span>filter-name>CAS Validation Filter</</span>filter-name>
<</span>filter-class>
org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</</span>filter-class>
<</span>init-param>
<</span>param-name>casServerUrlPrefix</</span>param-name>
<</span>param-value>https://sso.wsria.com:8443/cas</</span>param-value>
</</span>init-param>
<</span>init-param>
<</span>param-name>serverName</</span>param-name>
<</span>param-value>http://localhost:10000</</span>param-value>
</</span>init-param>
</</span>filter>
<</span>filter-mapping>
<</span>filter-name>CAS Validation Filter</</span>filter-name>
<</span>url-pattern>/*</</span>url-pattern>
</</span>filter-mapping>
<</span>filter>
<</span>display-name>AutoSetUserAdapterFilter</</span>display-name>
<</span>filter-name>AutoSetUserAdapterFilter</</span>filter-name>
<</span>filter-class>com.wsria.demo.filter.AutoSetUserAdapterFilter</</span>filter-class>
</</span>filter>
<</span>filter-mapping>
<</span>filter-name>AutoSetUserAdapterFilter</</span>filter-name>
<</span>url-pattern>/*</</span>url-pattern>
</</span>filter-mapping>
每个Filter的功能我就不多说了,都有注释的,关键要解释一下AutoSetUserAdapterFilter的作用和原理.
查看完整的web.xml请猛击这里 (Google code)
利用AutoSetUserAdapterFilter自动根据CAS信息设置Session的用户信息 :
先看一下这个Filter的源码 :
好的,如果你是老程序员应该很快就清楚Filter的目的,如果不太懂我再讲解一下;
主要是通过CAS的_const_cas_assertion_ 获取从CAS服务器登陆的用户名,然后再根据系统内部的用户工具(UserUtil.java )来判断是否已经登录过,如果没有登录根据登录名从数据库查询用户信息,最后使用设置把用户信息设置到当前session中。
这样就把用户信息保存到了Sessino中,我们就可以通过UserUtil工具来获取当前登录的用户了,我在实例项目中也加入了此功能演示,请看代码:main.jsp 的第44行处
补充一下 :如果是为一个老项目添加单点登录功能,那么基本不需要其他的修改,设置好上面的filter即可;当然最好获取用户信息的地方都调用一个工具类,统一管理不容易出错。
九、美化CAS服务器界面
CAS服务端(cas-server)的界面只能在测试的时候用一下,真正系统上线肯定需要定制开发自己的页面,就想网易 和CSDN 的统一认证平台一样,所有子系统的认证都通过此平台来转接,大家可以根据他们的页面自己定制出适合所属应用或者公司的界面;简单介绍一下吧,复制 cas\WEB-INF\view\jsp\default\ui的一些JSP文件,每一个文件的用途文件名已经区分了,自己修改了替换一下就可以了。
例如:
登录界面:casLoginView.jsp
登录成功:casGenericSuccess.jsp
登出界面:casLogoutView.jsp
十、结束语
花了一下午时间终于写完了,总共十项也算完美了。现在看来起始利用CAS实现单点登录其实不难,不要畏惧,更不要排斥!
本教程后面的代码部分均来自本博客 的wsria-demo 项目分支wsria-demo-sso
和本教程相关资料下载 :
本教程使用的演示程序,点击这里 下载
使用keytool生成的key和证书,点击这里 下载
你也可以申请免费的StartSSL CA证书: StartSSL(公司名:StartCom)也是一家CA机构,它的根证书很久之前就被一些具有开源背景的浏览器支持(Firefox浏览器、谷歌Chrome浏览器、苹果Safari浏览器等)。
申请地址:http://www.startssl.com 申请方法参考:http://www.linuxidc.com/Linux/2011-11/47478.htm
出自: http://www.kafeitu.me/sso/2010/11/05/sso-cas-full-course.html
![](http://dl.iteye.com/upload/picture/pic/101844/eeee078e-012d-333c-b847-97d28386b29d.jpg)
相关文章推荐
- 天网恢恢,生物识别技术替天行道
- [转]创建一个JavaScript弹出DIV窗口层的效果
- TF-IDF与余弦相似性的应用(三):自动摘要
- 【Objective-C Runtime】之理解
- 真机调试流程
- Java NIO.2 —— 文件或目录移动操作
- 台球初者小谈
- iOS自定义导航控制器侧滑返回的多种实现方法
- C++、C#、java算法学习日记02----选择排序(SelectSort)
- ListView item 的view设置背景后OnItemClick事件不响应 解决办法
- Android 判断app是否在前台还是在后台运行
- Odoo8.0中允许用户动态调整TreeView栏位宽度
- android五种布局模式
- 理解sychronized针对的是对象而非语句或者方法
- PopupWindow源码分析
- 学习windows驱动(内存对象)
- AlertDialog - 自定义单选对话框
- thinkphp 数据库字段自增自减
- iOS和Android的app界面设计规范
- iOS app审核参考信息地址