基于CAS的SSO搭建详细图文

基于CAS的SSO搭建详细图文

server.huweiqin.com  =>> 对应部署cas server的tomcat,这个虚拟域名还用于服务端证书生成

client1.huweiqin.com  =>>  对应部署client1客户端应用的tomcat

client2.huweiqin.com   =>> 对应部署client2客户端应用的tomcat

 

 

1.生成证书

keytool -genkey -alias huwqsso -keyalg RSA -keysize 1024 -keypass huweiqin -validity 365 -keystore c:\huweiqin.keystore -storepass huweiqin

[说明]:-alias后面的别名可以自定义,-keypass指定证书**库的密码, -storepass和前面keypass密码相同,否则下面tomcat 配置https 会访问失败 -keystore指定证书的位置,这里指定放在c盘根目录,**库名称可以自定义..这里是huweiqin.keystore

基于CAS的SSO搭建详细图文

【注意】:第一个让你输入的“您的名字与姓氏是什么”,请必须输入在C:\Windows\System32\drivers\etc\hosts文件中加入的服务端的域名.我这里也就是server.huweiqin.com,为何这么做?首先cas只能通过域名来访问,不能通过ip访问,同时上方是生成证书,所以要求比较严格,所以如果不这么做的话,及时最终按照教程配置完成,cas也可以正常访问,访问一个客户端应用虽然能进入cas验证首页,但是,当输入信息正确后,cas在回调转入你想访问的客户端应用的时候,会出现No subject alternative names present错误异常信息,这个错误也就是在上面输入的第一个问题答案不是域名导致、或者与hosts文件配置的不一致导致。

 

2.导出证书

keytool -export -alias huwqsso -keystore c:\huweiqin.keystore -file c:\huwqsso.crt -storepass huweiqin

【说明】:-alias后面的名称要与生成证书的命令里面的alias的名称一致. –keystore后面指定证书存放的位置,这里我放在C盘根目录,同时证书名称要与【生成证书】对应的命令里的keystore名称一致.这里是zhoubang.keystore,-file后面才crt路径,我也指定在c盘根目录. –storepass的证书密码要与上面输入的密码一致.

基于CAS的SSO搭建详细图文

 

3.客户端导入证书

keytool -import -file c:\huwqsso.crt -keystore "%JAVA_HOME%\jre\lib\security\cacerts" -alias huwqsso -trustcacerts

【说明】:-file指定证书的位置,也就是上一步导出证书的位置,即c:\ ssodemo.crt 命令中指定了JAVA_HOME,意思是将证书导入到客户端证书库,也就是jdk证书库中.因为客户端应用运行在本地,需要jdk的支持。

-trustcacerts   信任来自cacerts的证书

基于CAS的SSO搭建详细图文

回车之后,会让你输入**库口令,注意,这里的密码必须要输入changeit,不能输入上面指定的密码zhoubang,切记,否则导入客户端证书会有问题,如果是多台机器演示,需要在每一台客户端导入该证书,步骤都是一样的。当看到提示“是否信任此证书”,输入y回车即可,见下图:(说明,命令中的-alias后面的别名可以自定义,如果出现【证书未导入,别名<***>已经存在】的错误,该意思是说客户端的**库中已经存在该别名证书了,重新指定其他别名即可.)

 

部署CAS-Server相关的Tomcat

1、配置HTTPS

解压apache-tomcat-7.0.57-windows-x64.zip,我本地路径为E:\apache-tomcat-7.0.57,编辑E:\apache-tomcat-7.0.57\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:/huweiqin.keystore" keystorePass="huweiqin"

               clientAuth="false" sslProtocol="TLS" />

其中,keystoreFile就是创建证书的路径,keystorePass就是创建证书的密码

 

2、验证HTTPS配置

其他按照默认配置不作修改,双击E:\apache-tomcat-7.0.57\bin \startup.bat 启动tomcat 验证https是否配置成功,我本地使用火狐浏览器访问,在地址栏输入

https://server.huweiqin.com:8443/  出现下面画面,其实这就表明cas服务端tomcat的https配置是没有问题了.

基于CAS的SSO搭建详细图文

 

3、部署CAS-Server

CAS-Server 下载地址:http://www.jasig.org/cas/download

本文以cas-server-webapp-4.0.0.rar为例,解压提取cas-server-webapp-4.0.0.war文件,把改文件copy到E:\apache-tomcat-7.0.57\webapps 目下,并重命名为:cas.war.

启动tomcat,在浏览器地址栏输入:https://server.huweiqin.com:8443/cas ,回车,出现CAS服务端的登录验证首页:

基于CAS的SSO搭建详细图文

【说明】:此时,CAS只是单独运行,至于登录的用户名和密码是什么,请查看:

E:\apache-tomcat-7.0.57\webapps\cas\WEB-INF\deployerConfigContext.xml文件中有这样一段配置:

<bean id="primaryAuthenticationHandler"

          class="org.jasig.cas.authentication.AcceptUsersAuthenticationHandler">

        <property name="users">

            <map>

                <entry key="casuser" value="Mellon"/>

            </map>

        </property>

  </bean>

             

这个配置是默认静态配置用户名和密码,那就在浏览器的CAS服务的登陆框中输入用户名casuser和密码Mellon,登录看看效果,就会出现验证成功的页面,如下图。你也可以在文件中自己配置自己的用户名和密码。

基于CAS的SSO搭建详细图文

 

 

4、部署CAS客户端相关的Tomcat

使用tomcat默认自带的 webapps\examples 作为演示的简单web项目

本地解压了2份tomcat,作为客户端服务器

cas-client-core-3.2.1.jar、commons-logging.jar

首先,将上面2个jar分别放到E:\apache-tomcat-7.0.57-client1\webapps\examples\WEB-INF\lib目录

和E:\apache-tomcat-7.0.57-client2\webapps\examples\WEB-INF\lib目录

 

<Server port="18005" shutdown="SHUTDOWN">

 <Connector port="18080" protocol="HTTP/1.1"

   <Connector port="18009" protocol="AJP/1.3" redirectPort="8443" />

 

   <Server port="28005" shutdown="SHUTDOWN">

 <Connector port="28080" protocol="HTTP/1.1"

   <Connector port="28009" protocol="AJP/1.3" redirectPort="8443" />

 

   启动三个tomcat

   http://client1.huweiqin.com:18080/examples/servlets/

基于CAS的SSO搭建详细图文基于CAS的SSO搭建详细图文

 

 

看到上述界面表示apache-tomcat-7.0.57-client1的基本安装配置已经成功。

接下来需要配置最重要的内容,让客户端应用和CAS服务连接:

编辑E:\apache-tomcat-7.0.57-client1\webapps\examples\WEB-INF\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.huweiqin.com:8443/cas/login</param-value>

              </init-param>

              <init-param>

                     <param-name>serverName</param-name>

                     <param-value>http://client1.huweiqin.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.huweiqin.com:8443/cas</param-value>

              </init-param>

              <init-param>

                     <param-name>serverName</param-name>

                     <param-value>http://client1.huweiqin.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>

       <!-- ======================== 单点登录结束 ======================== -->

 

       修改编辑E:\apache-tomcat-7.0.57-client2\webapps\examples\WEB-INF\web.xml文件,加入的内容就是上面在第一个客户端的web.xml内容一致,只不过需要修改2处内容,就是几个url地址, 最终的配置如下:

       <!-- ======================== 单点登录开始 ======================== -->

<!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置-->

       <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.huweiqin.com:8443/cas/login</param-value>

              </init-param>

              <init-param>

                     <param-name>serverName</param-name>

                     <param-value>http://client2.huweiqin.com:28080</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.huweiqin.com:8443/cas</param-value>

              </init-param>

              <init-param>

                     <param-name>serverName</param-name>

                     <param-value>http://client2.huweiqin.com:28080</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>

       <!-- ======================== 单点登录结束 ======================== -->

 

 

启动全部

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

基于CAS的SSO搭建详细图文

基于CAS的SSO搭建详细图文

http://client2.huweiqin.com:28080/examples/servlets/servlet/HelloWorldExample

基于CAS的SSO搭建详细图文

http://client2.huweiqin.com:28080/examples/servlets/servlet/HelloWorldExample;jsessionid=2F075E8D0B3D63B27F4778D7E28A463D

基于CAS的SSO搭建详细图文

 

基于CAS的SSO搭建详细图文

 

 

 

 

 

 

换成自己的数据库连接

基于CAS的SSO搭建详细图文

<entry key-ref="dbAuthHandler" value-ref="primaryPrincipalResolver"/>

 

<!-- 指定c3p0数据源 -->

       <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

              <property name="driverClass" value="com.mysql.jdbc.Driver" />

              <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/huwqsso?useUnicode=true&amp;characterEncoding=utf-8&amp;zeroDateTimeBehavior=convertToNull" />

              <property name="user" value="root" />

              <property name="password" value="root" />

       </bean>

 

       <!-- 访问本地数据库 -->

       <bean id="dbAuthHandler"

      class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">

              <property name="dataSource" ref="dataSource"></property> 

           <property name="sql" value="select password from user where account = ?"></property>

      </bean>

 

错误1不能加中文

基于CAS的SSO搭建详细图文

基于CAS的SSO搭建详细图文

错误2:不能直接用;

基于CAS的SSO搭建详细图文

基于CAS的SSO搭建详细图文

错误 3:jdbc连接不能用username要用user

基于CAS的SSO搭建详细图文

基于CAS的SSO搭建详细图文

 

基于CAS的SSO搭建详细图文

基于CAS的SSO搭建详细图文

基于CAS的SSO搭建详细图文

另外还可修改登录注销的界面样式,这里只是讲了一整个搭建过程