===================================
使用CAS在Tomcat中实现单点登录
===================================
本文参考了 `使用CAS在Tomcat中实现单点登录
`_
和 `CAS实现单点登录(SSO)经典完整教程
`_
配套CAS Server
=========================
本教程使用的是 cas-server-3.4.10-release.zip.
#. 将 cas-server-3.4.10-release.zip 解压
#. 将解压后的文件夹中的 /module中的 cas-server-webapp-3.4.10.war 复制到 %TOMCAT_HOME%/webapps
#. 将拷贝后的war文件重命名成 cas.war (会在webapps文件夹下自动解压出 cas 文件夹, 下文中将用%CAS_SERVER_HOME%来表示这个文件夹)
#. 修改cas server 的配置文件 (修改cas server的配置文件是重点,将在下一节单独讲解)
修改 deployConfigContext.xml
-----------------------------
cas server的核心配置文件是 %CAS_SERVER_HOME%/WEB-INF/deployerConfigContext.xml, cas server构建在spring基础上.
配置DataSource
~~~~~~~~~~~~~~~
在 deployerConfigContext.xml文件中添加一个bean, 配置对应对用户数据库的数据库连接.
下面以mysql为例.
.. code-block :: xml
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/test
dbusername
dbpassword
配置PasswordEncoder
~~~~~~~~~~~~~~~~~~~~~~~~~~~
PasswordEncoder用来将用户登录时提供的密码进行编码,这样才能跟数据库中已经编码的用户密码进行比较.
下面是使用MD5加密用户密码为例.
.. code-block :: xml
配置AuthenticationHanlder
~~~~~~~~~~~~~~~~~~~~~~~~~~~
AuthenticationHandler将利用上面配置的dataSource跟passwordEncoder来验证用户身份是否合法.
AuthenticationHandler的是 Bean AuthenticationManager的property, 修改后的 xml 如下:
.. code-block :: xml
select password from user where name = ?
添加依赖包
---------------------
需要添加到WEB-INF/lib中的依赖包:
+ cas-server-support-jdbc-3.4.10.jar(在解压后的cas-server-release包的modules文件夹下)
+ mysql-connector-java.jar
+ commons-collections.jar
+ commons-dbcp.jar
+ commons-pool.jar
配置Tomcat SSL
====================================
CAS的安全性依赖于SSL, 所以运行CAS Server的Web Server Container必须启用SSL(https).
生成SSL证书
------------------
#. 删除 %JRE_HOME%/lib/security/cacerts
#. 生成证书
.. code-block :: bash
keytool -genkey -alias tomcat -keyalg RSA -keystore ~/Documents/keys/tomcat
#. 导出证书
.. code-block :: bash
keytool -export -file ~/Documents/keys/tomcat.crt -alias tomcat -keystore ~/Documents/keys/tomcat
#. 导入证书
.. code-block :: bash
sudo keytool -import -keystore /usr/lib/jvm/jdk1.6.0_22/jre/lib/security/cacerts -file ~/Documents/keys/tomcat.crt -alias tomcat
.. note::
+ keytool是JDK自带的证书生成工具, 位于 %JRE_HOME%/bin下面
+ alias tomcat 指定这个证书的别名是 tomcat
+ 上面过程中会多次提示输入 keystore password, 这个密码将在下面的配置中用到
修改server.xml文件
----------------------------
Tomcat的SSL默认是关闭的(注释掉的), 删除注释标记并添加证书位置和证书密码,修改后大致如下:
.. code-block :: xml
//生成证书时指定的密码
配置Web Application
==========================
Web application想使用CAS进行用户验证,需要将cas-client添加到web application中,本实例使用maven构建,使用的cas-client版本是 cas-client-core 3.2.1.
(想使用cas-client需要添加相关的依赖包进来,这里不再多讲, 使用maven来管理这些依赖可以节约很多时间)
修改web.xml
-------------
在web.xml中配置CAS Filter来保护那些需要授权才能进行访问的资源.
一般来说,需要添加如下配置到web.xml:
.. code-block :: xml
org.jasig.cas.client.session.SingleSignOutHttpSessionListener
CASFilter
org.jasig.cas.client.authentication.AuthenticationFilter
casServerLoginUrl
https://www.sf.com:8443/cas/login
serverName
http://www.sf.com:8080
CASFilter
/*
CASValidationFilter
org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter
casServerUrlPrefix
https://www.sf.com:8443/cas
serverName
http://www.sf.com:8080
CASValidationFilter
/*
CASRequestFilter
org.jasig.cas.client.util.HttpServletRequestWrapperFilter
CASRequestFilter
/*
CASAssertionThreadLocalFilter
org.jasig.cas.client.util.AssertionThreadLocalFilter
CASAssertionThreadLocalFilter
/*
在Web application中获取验证成功后的用户信息
-------------------------------------------
+ request.getRemoteUser() (用户信息被HttpServletRequestWrapperFilter设置到request中)
+ AssertionHolder.getAssertion().getPrincipal().getName() (用户信息被AssertionTheadLocalFilter设置到当前线程上)
给本机配置域名
==================
#. 修改 hosts 文件,想自己想要的域名指向本地,上面例子使用的域名是 www.sf.com
.. code-block :: bash
sudo vi /etc/hots
# 添加 127.0.0.1 www.sf.com
#. 刷新本地DNS
.. code-block :: bash
sudo /etc/init.d/networking restart