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

2023-05-16

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














本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一步步使用Tomcat+CAS完成单点登录 的相关文章

  • 2020煤炭生产经营单位(安全生产管理人员)操作证考试及煤炭生产经营单位(安全生产管理人员)模拟考试软件

    题库来源 xff1a 安全生产模拟考试一点通公众号小程序 2020煤炭生产经营单位 xff08 安全生产管理人员 xff09 操作证考试及煤炭生产经营单位 xff08 安全生产管理人员 xff09 模拟考试软件 xff0c 包含煤炭生产经营
  • 嵌入式系统 Boot Loader 技术内幕

    内容 xff1a 1 引言 2 Boot Loader 的概念 3 Boot Loader 的主要任务与典型结构框架 4 关于串口终端 5 结束语 关于作者 对于本文的评价 在 Linux 专区还有 xff1a 教程 工具与产品 代码与组件
  • PADS VX2.8 PCB版本的降低方法

    在PCB设计过程中 xff0c 可能会遇到不同版本的PCB文件 xff0c 高版本软件可以兼容低版本 xff0c 反之则不能 为了提高兼容性 xff0c 可以将拿到的高版本PCB文件降低为低版本 xff0c 以配合使用低版本软件打开 打开P
  • Ubuntu16.04 速腾rslidar-32线激光雷达使用详细记录

    0 rslidar 32线激光雷达参数 线束 xff1a 32线波长 xff1a 905nm激光等级 xff1a class1精度 xff1a 5cm xff08 典型值 xff09 测量距离 xff1a 0 2m 200m xff08 目
  • useradd 与 adduser

    useradd 选项 用户名 参数如下 xff1a c comment 指定一段注释性描述 d 目录 指定用户主目录 xff0c 如果此目录不存在 xff0c 则同时使用 m选项 xff0c 可以创建主目录 g 用户组 指定用户所属的用户组
  • Python——sqlalchemy.exc.ArgumentError

    报错信息 xff1a sqlalchemy exc ArgumentError Mapper mapped class XmjbqZby gt xmjbq zby could not assemble any primary key col
  • VirtualBox虚拟机ping不通主机,但是主机可以ping通虚拟机

    解决VirtualBox虚拟机不能ping通宿主机的问题 问题描述 在VirtualBox虚拟中 xff0c 无法ping通宿主机 xff0c 宿主机可以ping通虚拟机 虚拟机的网络已经设置为 桥接网卡 xff0c 也可以正常上网 解决方
  • RTThread-W25Q128的驱动基于SPI和SFUD

    文章目录 前言一 kconfig的配置1 配置对应的SPI和SFUD 二 SFUD的使用W25Q128的读写操作 三 关于写入的问题 前言 本文是一个初学者的学习记录 xff0c 可能有误 SFUD是针对flash的一种通用的组件 xff0
  • RT-Thread 基于QSPI驱动LY68L6400-SRAM

    前言 使用的是RTThread 标准版 xff0c 主控是STM32H743 xff0c SRAM是LY68L6400 xff0c 使用QSPI QSPI和SPI的区别 个人理解最大的区别就是SPI是串行 xff0c 数据输出 xff0c
  • 关于学习RTThread的随笔

    认识操作系统 关于单片机的学习是从51到ARM xff0c 慢慢的接触到了操作系统 xff0c 开始也不明白是什么 xff0c 就跟着原子哥的例程学 xff0c 也不知道哪个好 xff1f 开始学UCOS xff0c 后来又用学了FreeR
  • RT-Thread 串口的使用

    1 配置选用的串口 在kconfig文件中增加ENV的串口选项 xff0c 这边选择的是uart2 menuconfig BSP USING UART bool span class token string 34 Enable UART
  • 关于驱动中景园LCD和LVGL踩的一些坑

    背景介绍 我使用的是中景园的1 3寸 xff0c 240 240的LCD xff0c 主控是STM32L152系列 https item taobao com item htm spm 61 3688y 1 14 16 1916264bJ5
  • 使用物联网卡无法通讯

    在使用阿里云的物联网卡时 xff0c 遇到一个电信卡无法通讯的问题 xff0c 数据只能发不能收 xff0c 后来客服跟踪调查后发现 xff0c 物联网卡有一个IP地址的白名单 xff0c 需要让客服把通讯平台的IP地址加到这个白名单才行
  • ESP32+PIO+LGVL+gui_guider

    简介 本文基于VScode上安装platform插件 xff08 简称PIO xff09 来开发ESP32 xff0c 屏幕显示使用LVGL 43 gui guider 关于VScode上使用platfrom也是一把辛酸泪 很多朋友会安装不
  • ESP32+PIO+LGVL+gui_guider之【BUTTON实体按键】

    LVGL的Button外部按键 这个Button是没有触摸屏的情况下用外部的按键来对应屏幕上的按键 xff0c 比如屏幕上有个确定键 xff0c 你按下外部某个按键 xff0c 屏幕的确定键也相应显示按下 工作原理其实就是LVGL把外部按键
  • KEIL工程报错问题解决记录

    1 no section to be FIRST LAST 在一次下载了别人的工程后 xff08 来自51黑论坛STm32L低功耗测试的一个工程 xff09 xff0c 由于其他工程用的DPF包有所不同 xff0c 记得是按照提示更新了固件
  • Linux——centos7搭建node + Nginx + vue + mysql 的服务安装详细步骤

    一 安装所需的软件 二 进行具体配置 三 使用 以下配置及安装为已运行实测的笔记整理 xff0c 严格按照该步骤进行配置 xff0c 大概率上不会有问题 不懂linux的小白也可配置使用 当然 xff0c 最好还是了解一些linux基本的命
  • ONOS应用示例开发

    ONOS应用示例开发 风继续吹 15 04 09 9239 人围观 本文主要是提供了有关ONOS的基于意图的流量转发应用如何开发 构建及部署等方面的实战经验 xff0c 并且详细讲解了如何在命令行上调用服务的过程 最后 xff0c 介绍了在
  • 测试1234

    String mStaticDns 61 34 static com 34 34 static net 34 34 cdn bcebos com 34 34 pic cn 34 34 pic com 34 34 sina net 34 34
  • ubuntu共享文件夹权限问题

    新建的共享文件夹 xff0c 只有切换成root用户组时才能访问 xff0c 其他用户却没有权限 原因 xff1a 共享文件夹属于vboxsf组 解决方案 xff1a 把当前用户添加到vboxsf组 sudo adduser userNam

随机推荐