CAS单点登录(SSO)完整教程
前言
- 教程目的:从头到尾细细道来单点登录服务器及客户端应用的每个步骤
- 单点登录(SSO):请看百科解释猛击这里打开
- 本教程使用的SSO服务器是Yelu大学研发的CAS(Central Authentication Server),
官网:http://www.jasig.org/cas
本教程环境:
- Tomcat6.0.29
- JDK6
- 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等 参考
六、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行处,注释掉:SimpleTestUsernamePasswo
rdAuthenticationHandler这个验证Handler,这个是比较简单的,只是判断用户名和密码相同即可通过,这个肯定不能在实际应用中使用,弃用! - 注释掉92行后在下面添加下面的代码:
- <</span>bean
class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticat ionHandler"> -
<</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>
在文件的末尾之前加入如下代码:
- <</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>
- <</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目录
- 配置解释:
- QueryDatabaseAuthenticat
ionHandler 是cas-server-support-jdbc提供的查询接口其中一个,QueryDatabaseAuthenticat ionHandler是通过配置一个 SQL 语句查出密码,与所给密码匹配 - dataSource
我就不用解释了吧,就是使用JDBC查询时的数据源 - sql
语句就是查询哪一张表,本例根据t_admin_user表的login_name字段查询密码,CAS会匹配用户输入的密码,如果匹配则通过;下面是t_admin_user的表结构: - 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;
- CREATE
- passwordEncoder
,这个就算是自己加的盐巴了,意思很明显就是处理密码的加密,看你的应用中数 据库保存的是明码还是加密过的,比如本例是使用MD5加密的,所以配置了MD5PasswordEncoder这个Handler,cas内置了MD5的 功能所以只需要配置一下就可以了;如果在实际应用中使用的是公司自己的加密算法那么就需要自己写一个Handler来处理密码,实现方式也比较简单,创建 一个类继承org.jasig.cas.authentication.handler.PasswordEncoder然后在encode方法中加密用 户输入的密码然后返回即可
- QueryDatabaseAuthenticat
八、配置CAS客户端
- 添加cas-client的jar包
,有两种方式: - 传统型
:下载cas-client,地址:http://www.ja-sig.org/downloads/cas-clients/ ,然后解压cas-client-3.1.12.zip,在modules文件夹中有需要的jar包,请根据自己的项目情况选择使用 - Maven
型 : -
- <</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
先上配置信息:-
- <</span>listener>
-
<</span>listener-class>org.jasig.cas.client.session.SingleSignOutHttpSession Listener</</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.Cas20ProxyReceivingTicke tValidationFilter</</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)的界面只能在测试的时候用一下,真正系统上线肯定需要定制开发自己的页面,就想网易
例如:
登录界面:casLoginView.jsp
登录成功:casGenericSuccess.jsp
登出界面:casLogoutView.jsp
十、结束语
花了一下午时间终于写完了,总共十项也算完美了。
现在看来起始利用CAS实现单点登录其实不难,不要畏惧,更不要排斥!
本教程后面的代码部分均来自本博客
和本教程相关资料下载
- 本教程使用的演示程序,点击这里
下载 - 使用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