利用CAS实现SSO

1. 摘要:

本文主要是记录博主学习使用CAS的一个过程,以及在过程中遇到的各种错误(这个是主要的),相信大家都研究过一些技术,难点并不是这个东西怎么用, 而是在你用的过程中会遇到各种各样的错误,本文中的大部分错误都已经被网上的大神们解决过,在这里我只不过是整理一下罢了。

2. 前期准备:
  • apache-tomcat-6.0.37 (复制三份)

    —-tomcat–server
    —-tomcat-cas-app1
    —-tomcat-cas-app2

  • JDK-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:
    修改端口号为8081

  • tomcat-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,都一样的。
撰写本文不易,如有转载,请注明出处。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值