1. 摘要:
本文主要是记录博主学习使用CAS的一个过程,以及在过程中遇到的各种错误(这个是主要的),相信大家都研究过一些技术,难点并不是这个东西怎么用, 而是在你用的过程中会遇到各种各样的错误,本文中的大部分错误都已经被网上的大神们解决过,在这里我只不过是整理一下罢了。
2. 前期准备:
apache-tomcat-6.0.37 (复制三份)
—-tomcat–server
—-tomcat-cas-app1
—-tomcat-cas-app2JDK-1.6.0-45
cas-server-webapp-4.0.0.war
cas-client-core-3.2.1.jar
commons-logging-1.1.3.jar
3. 各种环境配置:
JDK:
配置java-home,不会的自行百度。
tomcat-server:
不需要https验证:使用默认配置即可。
(如果需要加载HTTPS证书验证的话,需要更改tomcat/conf/server.xml的配置)
需要https验证:稍后补充,需要使用toolkey生成一个本地的证书测试tomcat-app1:
修改端口号为8081tomcat-app2:
修改端口号为8082
4. cas-server端部署:
将cas-server-webapp-4.0.0.war包改名为cas.war置于 tomcat-server/webapp文件夹下,启动tomcat后,自动解压出名为cas的项目
访问登录地址:http://localhost:8080/cas/login
图中上方Non-secure Connection红色警告是由于没有在tomcat设置https验证出现的警告信息,可暂时忽略。
输入用户名casuser和密码Mellon后,点击LOGIN显示登录成功。
注销(登出)地址:http://localhost:8080/cas/logout
(注:在cas-server4.0以后,默认的登录密码为casuser/Mellon,在4.0以前只要用户名和密码相同即可登录,小伙伴们要注意自己cas-server的版本,具体的配置可以在cas/WEB-INF/deployerConfigContext.xml中修改)
至此,tomcat-server端部署完成。
5. cas-server修改不开启HTTPS验证
由于默认的cas-server是需要进行HTTPS的验证,所以需要证书的支持,本文暂不做HTTPS验证方式的server描述。
所以,需要修改一些cas的配置文件,打开tomcat-server/webapp/cas/WEB-INF:
目录结构如下:
需要修改的配置文件如下:
(1). WEB-INF/deployerConfigContext.xml
<!-- Required for proxy ticket mechanism. -->
<bean id="proxyAuthenticationHandler"
class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
p:httpClient-ref="httpClient" />
增加参数p:requireSecure="false",是否需要安全验证,即HTTPS,false为不采用。修改后为:
<bean id="proxyAuthenticationHandler"
class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
p:httpClient-ref="httpClient" p:requireSecure="false" />
(2). WEB-INF\spring-configuration\ticketGrantingTicketCookieGenerator.xml
<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="true"
p:cookieMaxAge="-1"
p:cookieName="CASTGC"
p:cookiePath="/cas" />
修改 p:cookieSecure="true" 为 p:cookieSecure="false"
即不开启https验证
(3). WEB-INF\spring-configuration\warnCookieGenerator.xml
<bean id="warnCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="true"
p:cookieMaxAge="-1"
p:cookieName="CASPRIVACY"
p:cookiePath="/cas" />
修改 p:cookieSecure="true" 为 p:cookieSecure="false"
即不开启https验证
6. cas-app端部署:
本次测试模拟两个不同的项目分别在两个tomcat下(可以是不同服务器)。
- 创建两个空的web项目,分别取名Test1,Test2
- 将cas-client-core-3.2.1.jar加入到Test1和Test2项目下
- 将commons-logging-1.1.3.jar加入到Test1和Test2项目下
(注意:坑,有好多文章没有提到此jar包,在新建的项目或者tomcat自带的example,作为cas-client端是需要此jar包的,否则,client端会报错。) - 分别修改两个项目的web.xml文件
<!-- ======================== 单点登录开始 ======================== -->
<!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置 -->
<listener>
<listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener
</listener-class>
</listener>
<!-- 该过滤器用于实现单点登出功能,可选配置。 -->
<filter>
<filter-name>CAS Single Sign Out Filter</filter-name>
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS Single Sign Out Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>CAS Filter</filter-name>
<filter-class>org.jasig.cas.client.authentication.AuthenticationFilter
</filter-class>
<init-param>
<param-name>casServerLoginUrl</param-name>
<param-value>http://你的IP:8080/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://你的IP:8081(Test2配置另外的端口号)</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->
<filter>
<filter-name>CAS Validation Filter</filter-name>
<filter-class>
org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter
</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>http://你的IP:8080/cas</param-value>
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://你的IP:8081(Test2配置另外的端口号)</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 该过滤器负责实现HttpServletRequest请求的包裹, 比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。 -->
<filter>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<filter-class>
org.jasig.cas.client.util.HttpServletRequestWrapperFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 该过滤器使得开发者可以通过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 Assertion Thread Local Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- ======================== 单点登录结束 ======================== -->
配置完成后,分别启动三个tomcat
启动完成后,访问地址http://10.3.34.112:8081/Test1 (本机IP自行修改)
Test1项目的index.jsp代码如下:
<body>
welcome Test1
</body>
由于我们修改了Test1的web.xml文件(实际上就是个拦截器,也可以说是过滤器),访问Test1的时候会去cas-server端寻找Key,如果有,那么将带着key跳转到Test1项目,如果没有(当前情况),则会跳转到cas-server端进行验证。
此时页面会自动跳转到cas-server的登录页面:
注意图中红线地方,这是cas-server端生成的标识,登录成功后会根据此标识跳转回你之前访问的应用。
输入用户名和密码登录:casuser/Mellon
可见,登录成功。
此时在去访问Test2 : http://10.3.34.112:8082/Test2 (本机IP自行修改)
由于已经在server端进行了登录,Test2直接访问成功,无需再进行登录。
至此,一个简单的cas登录完成。
7. 数据库方式登录验证:
以上的demo只是描绘了cas的工作流程,在实际运用中,肯定要通过查询数据库去进行登录的验证,那么接下来,就讲解如何使用cas连接数据库进行登录。
- 进入到tomcat/cas/WEB-INF目录下找到deployerConfigContext.xml文件:
1.注释掉原有的登录代码
<!-- 注释调默认的登录方式
<bean id="primaryAuthenticationHandler"
class="org.jasig.cas.authentication.AcceptUsersAuthenticationHandler">
<property name="users">
<map>
<entry key="casuser" value="Mellon"/>
</map>
</property>
</bean>
-->
2.增加dataSource配置
<!-- 定义数据库连接方式 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
p:driverClass="oracle.jdbc.driver.OracleDriver"
p:jdbcUrl="jdbc:oracle:thin:@10.3.34.112:1521:XE"
p:user="wz" p:password="admin" />
<!-- 定义数据库处理方式 -->
<bean id="dbAuthHandler"
class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"
p:dataSource-ref="dataSource" p:sql="select password from test_user where username=?" />
<!-- 如果密码配置了MD5加密,增加此配置p:passwordEncoder-ref="passwordEncoder" -->
<!-- 如果密码有MD5加密,增加此段配置
<bean id="passwordEncoder"
class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder"
c:encodingAlgorithm="MD5" p:characterEncoding="UTF-8" />
-->
以上的配置根据个人机器不同自行修改配置,注意修改SQL语句
3.修改数据库处理方式
<bean id="authenticationManager"
class="org.jasig.cas.authentication.PolicyBasedAuthenticationManager">
<constructor-arg>
<map>
<entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
<!--此段注释掉<entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" /> -->
<!--增加如下代码,修改数据库处理映射 -->
<entry key-ref="dbAuthHandler" value-ref="primaryPrincipalResolver" />
</map>
</constructor-arg>
4.在cas-server应用下添加相应jar包
cas-server-support-jdbc-4.0.0.jar
注意,jar包一定要是jdbc-版本的jar,之前博主下了个错误的jar包,导致各种问题。
比如这个包就是错的:cas-server-support-jdbc-4.0.0-RC1.jar(错)
ojdbc6.jar(其他不同数据库自行寻找jar包)
c3p0-0.9.1.2.jar(上面的配置文件中使用的是c3p0连接池,所以需要c3p0的jar包,小伙伴们根据实际应用选择)
5.在本地数据库见表
建一张简单的用户表即可,如下:
5.测试
全部修改完成后,启动部署cas-server的tomcat.
在配置Test1 和 Test2 的 Web.xml文件时,我们也配置了获取cas-server端数据的获取方式:
修改Test1,Test2的 index.jsp代码,获取登录的用户名:
<%
String username = request.getRemoteUser();
%>
<body>
welcome to Test1 : <%=username%>
</body>
访问地址:http://localhost:8081/Test1
现在使用casuser/Mellon 显示登录失败。
改用数据库中的用户名和密码登录:wangzhe/wangzhe
可见,登录成功,同时,在页面中也获取到了数据库中登录的用户名。
访问:http://localhost:8082/Test2
同样,不需要再次输入用户名和密码即可直接登录成功。
至此,CAS简单的应用流程全部完成。
8. 总结:
其实博主在使用过程中,首先做的是带HTTPS验证的,也在这里遇到了很多很多的问题,所以此篇文章中的坑还是很少的,小伙伴们注意一下文中标注的地方,自己修改成本机的环境,就可以运行了,至于带HTTPS验证的,以后有时间在整理上来吧。
PS:本文中测试的机器地址就是10.3.34.112, 所以大家别介意 我的URL一会儿是localhost 一会儿是 10.3.34.112,都一样的。
撰写本文不易,如有转载,请注明出处。