SSO单点登录 cas-server & cas-client 详细配置以及实现

前言:最近因为工作需要,须实现一个单点登录的功能,但是之前并没有接触过这方面的技术,也找了很多资料,后来慢慢算是把这个功能实现了吧。废话不多说,下面进入正题。


准备工作:

            windows10     x64位  (Windows系统不影响)
            jdk1.7.0_17  (jdk版本都行,没有要求,环境变量配置就不多说了)
            apache-tomcat-7.0.82  
            apache-tomcat-7.0.53

                ps:之所以使用了两个Tomcat是因为cas-server服务端我是制定了一个Tomcat来运行,另一个是专门来运行cas-client客户端。

修改windows下的host文件:

            找到  C:\Windows\System32\drivers\etc 目录下的 hosts 文件

就是这个样子

    然后在hosts文件内增加三条信息:
  • 127.0.0.1 server.sso.com
  • 127.0.0.1 client1.sso.com
  • 127.0.0.1 client2.sso.com

        ps:第一个地址是服务端,用以服务端证书生成,也就是cas认证中心服务地址(cas是基于HTTPS协议,所以也需要一个Tomcat的地址);下面两个则是cas-client客户端,分为1和2。
    
        关于ip地址一致的问题,这里解释一下,因为没有使用Linux(难道我会跟你说我不会?),所有模拟多个客户端情况,只需要改一下名字即可。
    

CAS证书生成:

    我们使用win+R进入dos命令使用以下指令:
        keytool -genkey -alias ssoserver -keyalg RSA -keysize 1024 -keypass aaa123 -validity 365 -keystore c:\aaaa\aaa123.keystore -storepass aaa123    

        ps:alias后面的为别名,可随意定义,keypass为证书密钥库的密码,kaypass和storpass要相同,keystore为证书存放位置,你们可以自己定义它放在哪里,后面则是密钥库的名称,这里定义的是aaa123.keystore,这里不多讨论。

    命令输入后会出现以下页面:

这里写图片描述

                    注意:若是出现错误是因为权限问题导致,那就将证书生成到c:\aaaa文件夹下(文件夹名称可以自己定义,可以参考我上面生成证书的地址),这样就可以了。  

导出证书:

    在cmd命令下继续输入,将证书导出:
    keytool -export -alias ssoserver -keystore c:\aaaa\aaa123.keystore -file c:\aaaa\ssoserver.crt -storepass aaa123

这里写图片描述

        注意:alias后面的名称要与生成证书命令的名称一致,storepass密码也要与证书生成命令的密码一致。

    现在我们来看看是否已经将证书导出到了c:\aaaa的目录下:

这里写图片描述

客户端导入证书:

        然后继续执行dos命令:keytool -import -keystore "C:\Program Files\Java\jdk1.7.0_17\jre\lib\security\cacerts" -file c:\aaaa\ssoserver.crt -alias ssoserver     

        输入上面的dos命令之后可能会出现下面图片中的情况:

这里写图片描述

        如果出现这种情况,我们进入存放jdk文件的地方(当前需要导入证书的jdk文件夹),右键-->管理员取得所有权

这里写图片描述

        然后我们继续执行一遍上面的命令:将证书导入jdk证书信任库

这里写图片描述

目前CAS服务端所需要的证书已经配置完成,下面我来开始配置Tomcat


配置Tomcat:

        我使用的是Tomcat-7.0.53配置的cas-server服务端

        先配置https:
            在apache-tomcat-7.0.53\conf\server.xml的配置文件中找到被注释的一段:
        <!--
           <Connector executor="tomcatThreadPool"
           port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />
        -->

        将注释去掉,修改成以下代码:
        <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
           maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
           keystoreFile="C:/aaaa/aaa123.keystore" keystorePass="aaa123"
           clientAuth="false" sslProtocol="TLS" />

        ps:keystoreFile是证书路径,keystorepass是你在创建证书时的密码。

这里写图片描述

启动Tomcat查看是否配置成功:

            我们Tomcat\bin目录下的startup.bat验证一下,地址栏记得输入之前我们在hosts文件中cas服务的地址:

            https://server.sso.com:8443/

这里写图片描述

            出现以上页面,我们点击继续前往,然后会进入Tomcat首页(我的Tomcat因为配置过,所以首页显示的是 Hello World!)。

这里写图片描述

部署cas-server认证中心:

    我下载的是cas-server-4.0.0.zip,解压之后里面有个modules的文件夹

这里写图片描述

    从里面将cas-server-webapp-4.0.0.war复制出来

这里写图片描述

    将它放到我们刚才配置好的Tomcat目录下的webapps文件夹中,并改名为:cas.war,然后Tomcat会自动生成一个cas的文件夹出来。

这里写图片描述

    启动Tomcat,在浏览器地址输入:

    https://server.sso.com:8443/cas

这里写图片描述

    目前CAS认证中心并没有连接数据库,去配置文件中查看一下:

    路径地址:apache-tomcat-7.0.53\webapps\cas\WEB-INF\deployerConfigContext.xml,找到如下代码:

这里写图片描述

key为用户名,value则是密码,我们填入用户名和密码验证一下。

这里写图片描述

至此,cas-server服务端已经部署成功了,但是我们往后肯定要和数据库打交道的,所以我们下面看看连接数据库登录。


连接MySQL数据验证登录:

        首先我们需要导入jar包:
            c3p0-0.9.1.2.jar
            cas-server-support-jdbc-4.0.0.jar
            mysql-connector-java-5.1.13-bin.jar

        将以上jar包放入:apache-tomcat-7.0.53\webapps\cas\WEB-INF\lib目录下

        然后我们修改cas文件中的配置文件:deployerConfigContext.xml,找到下面的代码 
            <entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />      
            注释该代码,然后指定自己本地的数据库访问代码
            <entry key-ref="dbAuthHandler" value-ref="primaryPrincipalResolver"/>

这里写图片描述

然后在加入新的配置代码:

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="com.mysql.jdbc.Driver" />
    <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/mydbuseUnicode=true&amp;characterEncoding=UTF-8" />
    <property name="user" value="root" />
    <property name="password" value="root"/>
    </bean>

<bean id="dbAuthHandler"
  class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"
  p:dataSource-ref="dataSource"
  p:sql="SELECT password FROM sec_user WHERE account=? and id=1" />

这里写图片描述

    现在使用数据的用户名和密码登录:

这里写图片描述

        登录成功,这就是CAS-server认证中心连接数据验证的方式。

至此,使用数据库验证也成功了,下面开始配置CAS-client客户端。


配置cas-client客户端:

    首先,我们需要两个jar包:
        cas-client-core-3.2.1.jar
        commons-logging.jar

    然后直接使用Tomcat\webapps\自带的examples作为演示。

我们重新准备一个Tomcat,然后取两个名字,我这里使用的名字是:

这里写图片描述

    可以看到两个Tomcat都是7.0.82版本的,我只是在Tomcat名称后面加了个-client1和client2,代表客户端1和客户端2。

    修改client1的端口号,因为是在一台机器上模拟多端登录,端口号肯定要修改一下,避免冲突。
    因为我们是模拟多端,所有Tomcat\conf\下面的server.xml第一条数据也要修改,因为要在同一台机器上打开多个Tomcat。

这里写图片描述

        之前是8005,将其修改为9005,这样的话就可以不用配置别的文件,从而达到Tomcat同时启动多个。

这里写图片描述

        这里面的端口记得修改,我这里修改成了18080,还有下面的port=8009我修改成了8010,这个不用详细说了。

        现在启动client1的Tomcat\bin\startup.bat,若是启动窗口中没有出现错误,说明端口配置没有问题;启动后我们在浏览器中输入此地址:

        http://client1.sso.com:18080/examples/servlets/   出现以下页面则是说明成功

这里写图片描述

我们成功看到上图界面后,我们接下来配置该文件中的web.xml配置:

        配置 apache-tomcat-7.0.82-client1\webapps\examples\WEB-INF下的web.xml文件,在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>https://server.sso.com:8443/cas/login</param-value>
        </init-param>
        <init-param>
            <param-name>serverName</param-name>
            <param-value>http://client1.sso.com:18080</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.Cas10TicketValidationFilter</filter-class>
        <init-param>
            <param-name>casServerUrlPrefix</param-name>
            <param-value>https://server.sso.com:8443/cas</param-value>
        </init-param>
        <init-param>
            <param-name>serverName</param-name>
            <param-value>http://client1.sso.com:18080</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>

配置好了之后我们先启动 cas-server 服务端的Tomcat,然后在启动 client1 的Tomcat:
这里写图片描述

两个Tomcat启动后在浏览器中输入下面的地址:

        http://client1.sso.com:18080/examples/servlets/servlet/HelloWorldExample

这里写图片描述

    我们看到这个时候我们输入上面的那个地址,自动跳转变成了CAS认证中心的地址,这个地方就是web.xml中的配置出现效果了。

这里写图片描述

    然后我们使用数据库的用户名和密码登录:

这里写图片描述

    验证成功之后可以看到浏览器的地址又回到了client1的地址上去了,并且在这上面还看到了传回一个jsessionid的字符串参数,这也是CAS认证中心的原理所在,使用的是cookie机制,不过我们目前不讨论这个cookie问题。



现在一个客户端的配置就完成了,相信大家也都对CAS认证理解一些了吧。那我们接下来把剩下的一个客户端也一起配置了,步骤还是跟上面的client1客户端一样,注意端口不要冲突,下面我直接上图片:

客户端client2的端口配置:
这里写图片描述
这里写图片描述

    配置apache-tomcat-7.0.82-client2\webapps\examples\WEB-INF中的web.xml文件也和client1的一样,不过有个地方需要修改一下,直接上图片:

这里写图片描述

目前cas-server服务端和client1和client2客户端已经配置好了。进入最后的实现阶段。


最后实践步骤:

            首先:我们先启动Tomcat,我是同一台机器上启动了三个Tomcat,分别对应的是服务端和两个客户端

这里写图片描述

然后我们现在启动Tomcat之后,在浏览器上打开三个地址,分别是

            cas-server服务端:https://server.sso.com:8443/cas/login

            client1客户端:http://client1.sso.com:18080/examples/servlets/servlet/HelloWorldExample

            client2客户端:http://client2.sso.com:28080/examples/servlets/servlet/HelloWorldExample

这里写图片描述

图片上已经给出来了,只要任意一个客户端没有登录,都会跳转到CAS认证中心去,提示让你登录,当我们在任意一个客户端登录的时候,其他的页面我们只需要按下F5刷新一下,就都是登录状态了。

这就是CAS单点登录的基本实现了。至于我们使用myeclipse或者idea编程软件去编写一个web项目来验证,原理也不会改变。




好了,单点登录目前暂时就先写这么多,后期有什么问题我会继续补充的,大家有什么问题可以留言,我会一一回复,后续的话我会把jar包和配置过的Tomcat链接贴出来,今天先到这里。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值