关闭

一步步使用Tomcat+CAS完成单点登录

3997人阅读 评论(0) 收藏 举报
分类:

1.最基本的单点登录

         

客户端配置:

1.Tomcat配置SSL 1.生成证书 打开cmd或终端,命令行切换到Tomcat所在目录,执行如下命令: D:\JayHe\Environment\tomcat-8.0.33>keytool -genkey -alias tomcat_key -keyalg RSA -storepass changeit -keystore server.keystore -validity 3600 说明: -validity 指证书的有效期(天),缺省有效期很短,只有90天 2.导出证书 D:\JayHe\Environment\tomcat-8.0.33>keytool -export -trustcacerts -alias tomcat_key -file server.cer -keystore server.keystore -storepass changeit 说明: 证书存储在 server.cer 文件中 3.导入证书 D:\JayHe\Environment\tomcat-8.0.33>keytool -import -trustcacerts -alias tomcat_key -file server.cer -keystore cacerts -storepass changeit

         
   2.Tomcat配置
                     完成密钥文件、证书文件、密钥库文件后即可进行服务端Tomcat的配置,
                     打开$CATALINA_HOME/conf/server.xml文件,注释掉如下代码段:
                     <Connector port="80"protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/>
                     并取消注释<Connectorport="8443" protocol="HTTP/1.1" SSLEnabled="true"…/>代码段,修改

                           
 <Connector executor="tomcatThreadPool"
                                           port="8080" protocol="HTTP/1.1"
                                           connectionTimeout="20000"
                                           redirectPort="8443" />

                                <!-- Define a SSL/TLS HTTP/1.1 Connector on port 8443
                                     This connector uses the NIO implementation that requires the JSSE
                                     style configuration. When using the APR/native implementation, the
                                     OpenSSL style configuration is required as described in the APR/native
                                     documentation -->
                                <!-- keystorePass="" 是配置SSL时导入证书是填的密码,如果没有可不填 -->
                                <!--
                                <Connector port="443" protocol="HTTP/1.1" keystoreFile="/server.keystore" truststoreFile="cacerts"
                                           keystorePass="" maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
                                           clientAuth="false" sslProtocol="TLS" />
                                -->
                                <Connector port="443" protocol="HTTP/1.1" keystoreFile="/server.keystore" truststoreFile="cacerts"
                                           maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
                                           clientAuth="false" sslProtocol="TLS" />


 3.生成客户端密匙库文件
                            单向认证的客户端配置只需生成客户端信任文件caserts即可。首先将服务端生成的证书文件(之前生成的casserver.cer文件)复制到$JAVA_HOME/jre/lib/security下,然后打开CMD窗口切换到$JAVA_HOME/jre/lib/security下并执行命令:
                                           C:\Program Files\Java\jdk1.8.0_45\jre\lib\security>keytool -import -trustcacerts -alias casclient -storepass ssoclient -file server.cer -keystore cacerts -storepass changeit
                            说明:
                                 如果配置过程中显示密码错误,可使用  -storepass changeit , changeit是jdk默认的证书密码



CAS服务端:

CAS默认用户名和密码: casuser/Mellon 到cas官网下载cas-server http://developer.jasig.org/cas/(我下载的是4.0.0) 解压压缩文件,在解压后的文件夹内找到/modules/cas-server-webapp-4.0.0.war。将其复制到%Tomcat_Home%\webapps下并改名为cas.war 启动Tomcat,并测试 https://localhost:8443/cas 看是否访问正常(默认输入用户名和密码一致就可以)。 注:CAS Server 4.0.0 默认登陆验证方式是 AcceptUsersAuthenticationHandler (老版本好像是SimpleTestUsernamePasswordAuthenticationHandler), 默认用户名/密码为 casuser/Mellon(cas/WEB-INF/deployerConfigContext.xml 中找到 id=primaryAuthenticationHandler 的bean查看,里面的map也可以自己增加更多个)。 我们通常需要从数据库中取出用户名和密码进行验证,所以我们需要修改 deployerConfigContext.xml,配置我们自己的服务认证方式




2.基于JDBC的CAS单点登录


使用JDBC的认证方法:      用户名和密码: admin/123456

服务端 --- 配置使用JDBC的认证方式

1.cas/WEB-INF/deployerConfigContext.xml,添加一个新的 bean 标签:
                 <bean id="casDataSource" class="org.apache.commons.dbcp.BasicDataSource">
                    <property name="driverClassName">
                        <value>com.mysql.jdbc.Driver</value>
                    </property>
                    <property name="url">
                        <value>jdbc:mysql://localhost:3306/jay_db1</value>
                    </property>
                    <property name="username">
                        <value>root</value>
                    </property>
                    <property name="password">
                        <value>root</value>
                    </property>
                </bean>

2.配置 AuthenticationHandler
                <bean id="primaryAuthenticationHandler"
                    class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">
                    <property name="dataSource" ref="casDataSource" />
                    <property name="sql" value="select password from t_user where lower(account) = lower(?)" />
                    <property name="passwordEncoder" ref="passwordEncoder" />
                </bean>
                <bean id="passwordEncoder"
                    class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder" >
                    <constructor-arg name="encodingAlgorithm" value="MD5"/>
                    <property name="characterEncoding" value="UTF-8"/>
                </bean>

3.注意:
       DataSource 依赖于 commons-collections-3.2.jar、commons-dbcp-1.2.1.jar、commons-pool-1.3.jar、数据库驱动包、
       cas对jdbc的支持包cas-server-support-jdbc-4.0.0.jar,需要找到这几个jar包放进 %TOMCAT_HOME%/webapps/cas/WEB-INF/lib 目录

客户端 --- 应用程序连接CAS服务器

1.maven依赖 或 jar包导入cas-client-core.jar <dependency> <groupId>org.jasig.cas.client</groupId> <artifactId>cas-client-core</artifactId> <version>3.4.1</version> </dependency> 2.导入其他依赖包 commons-logging-1.2.jar 说明: 1.启动报错:java.lang.IllegalArgumentException: casServerUrlPrefix cannot be null. 解决方案:使用低版本的客户端 <dependency> <groupId>org.jasig.cas.client</groupId> <artifactId>cas-client-core</artifactId> <version>3.2.0</version> </dependency> 3.新建2个Web项目(CasDemo, CasDemo2),在每个项目中修改web.xml配置,添加内容如下: --- 连接CAS服务器

</pre>
                  <!-- 该过滤器用于实现单点登出功能,可选配置。 -->
                  <!--    登出地址 https://casserver:8443/cas/logout -->
                  <filter>
                      <filter-name>CAS Single Sign Out Filter</filter-name>
                      <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
                  </filter>

                  <!-- 该过滤器负责用户的认证工作,必须启用它 -->
                  <filter>
                      <filter-name>CAS Authentication Filter</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>
                      <init-param>
                          <param-name>serverName</param-name>
                          <param-value>http://localhost:8080</param-value>
                      </init-param>
                  </filter>

                  <!-- 该过滤器负责对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://localhost:8443/cas</param-value>
                      </init-param>
                      <init-param>
                          <param-name>serverName</param-name>
                          <param-value>http://localhost:8080</param-value>
                      </init-param>
                      <init-param>
                          <param-name>redirectAfterValidation</param-name>
                          <param-value>true</param-value>
                      </init-param>
                  </filter>

                  <!-- 该过滤器负责实现HttpServletRequest请求的包装, 比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。 -->
                  <filter>
                      <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
                      <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
                  </filter>

                  <!-- 该过滤器使得开发者可以通过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 Single Sign Out Filter</filter-name>
                      <url-pattern>/*</url-pattern>
                  </filter-mapping>
                  <filter-mapping>
                      <filter-name>CAS Authentication Filter</filter-name>
                      <url-pattern>/*</url-pattern>
                  </filter-mapping>
                  <filter-mapping>
                      <filter-name>CAS Validation Filter</filter-name>
                      <url-pattern>/*</url-pattern>
                  </filter-mapping>
                  <filter-mapping>
                      <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
                      <url-pattern>/*</url-pattern>
                  </filter-mapping>
                  <filter-mapping>
                      <filter-name>CAS Assertion Thread Local Filter</filter-name>
                      <url-pattern>/*</url-pattern>
                  </filter-mapping>

                  <listener>
                      <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
                  </listener>
                  <!-- ======================== 单点登录/登出结束 ======================== -->


4.验证登录
     http://localhost:8080/CasDemo
     http://localhost:8080/CasDemo2
     当有一个项目登录成功后,另一个项目自动登录    (CAS使用JDBC方式认证,用户名密码:admin/123456)




CAS原理


基础模式 SSO 访问流程主要有以下步骤:

1. 访问服务: SSO 客户端发送请求访问应用系统提供的服务资源。

2. 定向认证: SSO 客户端会重定向用户请求到 SSO 服务器。

3. 用户认证:用户身份认证。

4. 发放票据: SSO 服务器会产生一个随机的 Service Ticket 。

5. 验证票据: SSO 服务器验证票据 Service Ticket 的合法性,验证通过后,允许客户端访问服务。

6. 传输用户信息: SSO 服务器验证票据通过后,传输用户认证结果信息给客户端。

下面是 CAS 最基本的协议过程:

 

CAS实现SSO单点登录原理

基础协议图

 

如 上图: CAS Client 与受保护的客户端应用部署在一起,以 Filter 方式保护 Web 应用的受保护资源,过滤从客户端过来的每一个 Web 请求,同 时, CAS Client 会分析 HTTP 请求中是否包含请求 Service Ticket( ST 上图中的 Ticket) ,如果没有,则说明该用户是没有经过认证的;于是 CAS Client 会重定向用户请求到 CAS Server ( Step 2 ),并传递 Service (要访问的目的资源地址)。 Step 3 是用户认证过程,如果用户提供了正确的 Credentials , CAS Server 随机产生一个相当长度、唯一、不可伪造的 Service Ticket ,并缓存以待将来验证,并且重定向用户到 Service 所在地址(附带刚才产生的 Service Ticket ) , 并为客户端浏览器设置一个 Ticket Granted Cookie ( TGC ) ; CAS Client 在拿到 Service 和新产生的 Ticket 过后,在 Step 5 和 Step6 中与 CAS Server 进行身份核实,以确保 Service Ticket 的合法性。

在该协议中,所有与 CAS Server 的交互均采用 SSL 协议,以确保 ST 和 TGC 的安全性。协议工作过程中会有 2 次重定向 的过程。但是 CAS Client 与 CAS Server 之间进行 Ticket 验证的过程对于用户是透明的(使用 HttpsURLConnection )。

    CAS 请求认证时序图如下:

 

CAS实现SSO单点登录原理  





















参考:
http://www.open-open.com/lib/view/open1432381488005.html
http://blog.csdn.net/hongbinchen/article/details/6745656















0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1041262次
    • 积分:14761
    • 等级:
    • 排名:第824名
    • 原创:416篇
    • 转载:215篇
    • 译文:0篇
    • 评论:135条
    博客专栏
    最新评论