CAS单点登录完整教程
原文:http://blog.csdn.net/frinder/article/details/7969925
1、创建证书
在当前文件夹下打开终端的快捷键:按住Shift并右键鼠标
用JDK自带的keytool工具生成证书:
keytool -genkey -alias wsria -keyalg RSA -keystore d:/keys/wsriakey
keystore密码:keystore


严重提醒:提示输入域名的时候不能输入IP地址
2、导出证书
D:\keys>keytool -export -file d:/keys/wsria.crt -alias wsria -keystore d:/keys/wsriakey
特别提示:如果提示:
keytool error: java.io.IOException: Keystore was tampered with, or password was incorrect
那么请输入密码:changeit

至此导出证书完成,可以分发给应用的JDK使用了,接下来讲解客户端的JVM怎么导入证书。
3、为客户端的JVM导入证书
keytool -import -keystore D:\tools\jdk\1.6\jdk1.6.0_20\jre\lib\security\cacerts -file D:/keys/wsria.crt -alias wsria


使用keytool工具删除证书时出现Java.io.IOException: Keystore was tampered with, or password was incorrect 异常的解决办法:
对于很多服务器比如glassfish或者tomcat之类的,在证书过期,我们需要删除时,需要输入保护密码,默认的就是changeit,输入这个密码就可以了。

特别说明
D:\tools\jdk\1.6\jdk1.6.0_20\jre\lib\security -- 是jre的目录;密码还是刚刚输入的密码。至此证书的创建、导出、导入到客户端JVM都已完成,下面开始使用证书到Web服务器中,本教程使用tomcat。
4、应用证书到Web服务器-Tomcat
说是应用起始做的事情就是启用Web服务器(Tomcat)的SSL,也就是HTTPS加密协议
本教程使用的apache-tomcat-7.0.68 打开tomcat目录的conf/server.xml文件,开启83和87行的注释代码,并设置keystoreFile、keystorePass修改结果如下:

参数说明:
- keystoreFile:在第一步创建的key存放位置
- keystorePass:创建证书时的密码
好了,到此Tomcat的SSL启用完成,现在你可以启动tomcat试一下了,例如本教程输入地址:https://sso.wsria.com:8443/ 打开的是:

好的,那么我们点击“继续浏览此网站(不推荐)。现在进入Tomcat目录了吧,如果是那么你又向成功迈进了一步。
OK,接下来要配置CAS服务器了。
5、CAS服务器初体验
下载完成后将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默认的验证规则只要用户名和密码相同就通过)所以如果你看到下面的这张图片你就成功了

5、CAS服务器深入配置
上面的初体验仅仅是简单的身份验证,实际应用中肯定是要读取数据库的数据,下面我们来进一步配置CAS服务器怎么读取数据库的信息进行身份验证。 首先打开
tomcat/webapp/cas/WEB-INF/deployerConfigContext.xml
配置的地方如下:
注释掉:SimpleTestUsernamePasswordAuthenticationHandler这个验证Handler,这个是比较简单的,只是判断用户名和密码相同即可通过,这个肯定不能在实际应用中使用,弃用!
注释掉131行后在下面添加下面的代码:

在文件的末尾之前加入如下代码:

复制cas-server-3.4.3.1\modules\cas-server-support-jdbc-3.4.3.1.jar和MySQL驱动jar包到tomcat/webapp/cas/WEB-INF/lib目录
配置解释:
l QueryDatabaseAuthenticationHandler,是cas-server-support-jdbc提供的查询接口其中一个,QueryDatabaseAuthenticationHandler是通过配置一个 SQL 语句查出密码,与所给密码匹配
l dataSource,我就不用解释了吧,就是使用JDBC查询时的数据源
l sql,语句就是查询哪一张表,本例根据t_admin_user表的login_name字段查询密码,CAS会匹配用户输入的密码,如果匹配则通过;下面是t_admin_user的表结构:

l passwordEncoder,这个就算是自己加的盐巴了,意思很明显就是处理密码的加密,看你的应用中数据库保存的是明码还是加密过的,比如本例是使用MD5加密的,所以配置了MD5PasswordEncoder这个Handler,cas内置了MD5的功能所以只需要配置一下就可以了;如果在实际应用中使用的是公司自己的加密算法那么就需要自己写一个Handler来处理密码,实现方式也比较简单,创建一个类继承org.jasig.cas.authentication.handler.PasswordEncoder然后在encode方法中加密用户输入的密码然后返回即可
7、配置CAS客户端
添加cas-client的jar包,有两种方式:
传统型
下载cas-client,地址:http://www.ja-sig.org/downloads/cas-clients/,然后解压cas-client-3.1.12.zip,在modules文件夹中有需要的jar包,请根据自己的项目情况选择使用
用maven打包server的方式一样,在cas-client-3.2.1目录中运行命令:
mvn package -pl cas-client-core -DskipTests=true
然后从target目录中复制cas-client-core-3.2.1.jar到应用的WEB-INF/lib目录中
Maven型
<dependency> <groupid>org.jasig.cas.client</groupid> <artifactid>cas-client-core</artifactid> <version>3.1.12</version> </dependency>
设置filter
编辑web.xml,然后粘贴下面的代码:
<!-- 按照顺序配置四个Filter 1,AuthenticationFilter 2,TicketValidationFilter 3,HttpServletRequestWrapperFilter 4,AssertionThreadLocalFilter CAS Client默认会先从init-param取,没取到从context-param取 --> <!-- AuthenticationFilter用来拦截所有的请求,用以判断用户是否需要通过CAS Server进行认证 必须指定Cas Server登录地址,casServerLoginUrl 认证成功后需要跳转地址的serverName或service,参数service具有更高的优先级 service指定一个确定的URL,serviceName指定的是主机名 --> <context-param> <param-name>serverName</param-name> <param-value>http://localhost:8080</param-value> </context-param> <filter> <filter-name>casAuthentication</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/login</param-value> </init-param> </filter> <filter-mapping> <filter-name>casAuthentication</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 在请求通过AuthenticationFilter认证之后,如果请求中携带了参数ticket 将会由TicketValidationFilter来对携带的ticket进行校验,多种验证ticket的Filter 都继承自AbstractTciketValidationFilter,使用的TicketValidation不一样 必须指定的参数,casServerUrlPrefix,用来指定CAS Server对于URL地址的前缀 serverName或service --> <filter> <filter-name>casTicketValidationFilter</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</param-value> </init-param> </filter> <filter-mapping> <filter-name>casTicketValidationFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- HttpServletRequestWrapperFilter用于将每一个请求对应的HttpServletRequest 封装成内部定义的CasHttpServletRequestWrapper,利用Assertion对象重写getUserPrinicipal()方法 getRemoteUser()、isUserInRole()方法 --> <filter> <filter-name>casHttpServletRequestWrapper</filter-name> <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class> </filter> <filter-mapping> <filter-name>casHttpServletRequestWrapper</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- AssertionThreadLocalFilter是方便获取Assertion对象,将当前Assertion对象存放到当前的线程变了中 --> --> <filter> <filter-name>casAssertionThreadLocalFilter</filter-name> <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class> </filter> <filter-mapping> <filter-name>casAssertionThreadLocalFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
利用AutoSetUserAdapterFilter自动根据CAS信息设置Session的用户信息. 主要是通过CAS的const_cas_assertion获取从CAS服务器登陆的用户名,然后再根据系统内部的用户工具(UserUtil.java)来判断是否已经登录过,如果没有登录根据登录名从数据库查询用户信息,最后使用设置把用户信息设置到当前session中。 这样就把用户信息保存到了Session中,我们就可以通过UserUtil工具来获取当前登录的用户了。
补充一下:
如果是为一个老项目添加单点登录功能,那么基本不需要其他的修改,设置好上面的filter即可;当然最好获取用户信息的地方都调用一个工具类,统一管理不容易出错。

八、单点退出
这个比较简单,把你的退出链接设置为:https://sso.wsria.com/cas/logout 即可。
九、疑难问题
如果遇到了意料之外的问题请参考文章的评论部分,或许能找到问题的原因以及解决办法!
javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No name matching casserver found
由于创建证书的域名和在应用中配置的cas服务域名不一致导致以下错误
Ticket验证异常org.jasig.cas.client.validation.TicketValidationException:
http://www.cnblogs.com/oujiao/articles/6404382.html
解决PKIX(PKIX path building failed) 问题 unable to find valid certification path to requested target:
http://www.cnblogs.com/oujiao/articles/6404234.html
成功登录页面


浙公网安备 33010602011771号