CAS单点登录方案

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介: 应用场景 当几个应用系统需要同一个入口时,那么此时就需要配置CAS统一单点登录了。操作步骤 SSO实现有很多产品,我们今天选用的这个是耶鲁大学发明的CAS SSO服务器。

应用场景

当几个应用系统需要同一个入口时,那么此时就需要配置CAS统一单点登录了。

操作步骤

SSO实现有很多产品,我们今天选用的这个是耶鲁大学发明的CAS SSO服务器。这个CAS SSO是目前我看到过的功能较全的,使用也是最简单的配置式SSO服务器,它基于SPRING的原理,因此这个配置文件我们看起来因当是相当的熟悉的。
示例以cas-server-3.5.2-release.zip结合web应用完成单点登录方案验证。

1、搭建cas server环境

打开cas.zip包,解压后,将cas文件夹拷贝到tomcat的webapps中。
启动应用服务器后,war包自动部署后访问http://ip:port/cas/login打开cas登录页面,默认密码admin/admin,点击登录显示登录成功,表明cas server搭建成功。

2、配置web实现单点登录

打开应用服务器目录,进入WEB-INF目录,编辑web.xml文件,具体修改过程如下所示:

首先注释下面filter过滤器
<!--
<filter>
    <filter-name>userAuthenticationFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    <init-param>
        <param-name>targetBeanName</param-name>
        <param-value>userAuthenticationFilter</param-value>
    </init-param>
    <init-param>
        <param-name>targetFilterLifecycle</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>userAuthenticationFilter</filter-name>
    <url-pattern>*.do</url-pattern>
</filter-mapping> 
-->
接下来新增过滤器如下(放到过滤器的最前面)
<!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置 -->
<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 Authentication Filter</filter-name>
    <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
    <init-param>
        <param-name>localLoginUrl</param-name>
        <param-value>http://192.168.202.6:8086/dgs/login.do</param-value>
    </init-param>
    <!--这里的server是服务端的IP-->
    <init-param>
        <param-name>casServerLoginUrl</param-name>
        <param-value>http://192.168.202.6:8081/cas/login</param-value>
    </init-param>
    <init-param>
        <param-name>renew</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>serverName</param-name>
        <param-value>http://192.168.202.6:8086</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CAS Authentication 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://192.168.202.6:8081</param-value>
    </init-param>
    <init-param>
        <param-name>redirectAfterValidation</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>useSession</param-name>
        <param-value>true</param-value>
    </init-param>
    <init-param>
        <param-name>serverName</param-name>
        <param-value>http://192.168.202.6:8086</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>

注:以上配置中的IP地址及端口信息请结合cas服务器及web服务器实际部署情况进行修改。
http://127.0.0.1:6080/dgs/login.do为具体应用的登录入口。
http://127.0.0.1:8080/cas/login为CAS单点登录服务器登录入口。

3、web应用单点登录补丁

修改webapps\dgs\WEB-INF\classes中的deploy.properties文件,新增属性
SSO_LOG_EXCEPTION=http://IP:8080/cas/logout?service=http://IP:6080/dgs/login.do
http://IP:8080/cas/logout为CAS server登出连接。

4、CAS从数据库获取登录帐号和密码

CAS默认登录帐号为admin/admin仅用于测试的帐号信息,存在安全隐患,现介绍从数据库中获取帐号和密码的配置方法。

首先创建数据库表TB_SYS_USER,以MYSQL为例,脚本如下
CREATE TABLE `TB_SYS_USER` (
`USER_ID`  varchar(64) NOT NULL ,
`PASSWORD`  varchar(128) NOT NULL ,
PRIMARY KEY (`USER_ID`)
);
同步web应用中的帐号和密码至TB_SYS_USER中。
修改配置文件deployerConfigContext.xml,增加jdbc数据库(以MySql为例)连接
<bean id="dataSource"  class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
    <property name="url" value="jdbc:mysql://192.168.202.6:3306/test" />  
    <property name="username" value="root" />  
    <property name="password" value="11111" />  
</bean>
配置加密方式,CAS内置有MD5加密,也可以自己编写加密类,实现PasswordEncoder接口即可:
<bean id="MD5passwordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder">
    <constructor-arg index="0">
        <value>MD5</value>
    </constructor-arg>
</bean>

注释掉默认的验证方式,采用数据库查询验证:
<!--<bean
class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />-->
<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">  
    <property name="dataSource" ref="dataSource" ></property>  
    <property name="sql" value="select password from tb_sys_user where user_id=?" />
    <property name="passwordEncoder" ref="MD5passwordEncoder"/>
</bean> 

添加相关jar包至CAS server的WEB-INF目录中的libs中,打开cas-server-3.5.2-release.zip进入modules目录,拷贝cas-server-support-jdbc-3.5.2.jar至libs中,同时下载mysql数据库连接驱动mysql-connector-java-5.0.8-bin.jar至libs中,重启CAS server。

5、服务登出访问

服务器端退出访问:http://localhost:8080/cas/logout,若希望退出后能返回则需要配置,服务端cas-servlet.xml配置
<bean id="logoutController" class="org.jasig.cas.web.LogoutController"
    p:centralAuthenticationService-ref="centralAuthenticationService"
    p:logoutView="casLogoutView"
    p:warnCookieGenerator-ref="warnCookieGenerator"
p:ticketGrantingTicketCookieGenerator-ref="ticketGrantingTicketCookieGenerator"/>
增加属性 p:followServiceRedirects="true"
退出链接为:http://localhost:8080/cas/logout?service=http://localhost:6080/dgs
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
Java
Java中的抽象类:深入了解抽象类的概念和用法
Java中的抽象类是一种不能实例化的特殊类,常作为其他类的父类模板,定义子类行为和属性。抽象类包含抽象方法(无实现)和非抽象方法。定义抽象类用`abstract`关键字,子类继承并实现抽象方法。抽象类适用于定义通用模板、复用代码和强制子类实现特定方法。优点是提供抽象模板和代码复用,缺点是限制继承灵活性和增加类复杂性。与接口相比,抽象类可包含成员变量和单继承。使用时注意设计合理的抽象类结构,谨慎使用抽象方法,并遵循命名规范。抽象类是提高代码质量的重要工具。
788 1
|
存储 分布式计算 算法
【底层服务/编程功底系列】「大数据算法体系」带你深入分析MapReduce算法 — Shuffle的执行过程
【底层服务/编程功底系列】「大数据算法体系」带你深入分析MapReduce算法 — Shuffle的执行过程
805 0
|
监控 数据可视化 搜索推荐
评测:如何通过高效的工具制定清晰的会务日程安排与任务清单?
随着2024年的到来,全球会议和活动安排日益重要。有效的会务日程管理工具不仅能提升工作效率,还能确保活动顺利进行。本文推荐六款适合2024年的会务日程安排工具:板栗看板、Trello、Asana、Monday.com、Microsoft Planner和ClickUp,分别介绍它们的功能、特点和适用场景,帮助您找到最合适的工具。
评测:如何通过高效的工具制定清晰的会务日程安排与任务清单?
|
IDE 关系型数据库 开发工具
公认超级好用的Mac软件汇总(一)
公认超级好用的Mac软件汇总
670 0
|
存储 安全 关系型数据库
FileZilla Server提权与常见问题
FileZilla Server提权与常见问题
1338 0
|
Linux vr&ar 开发者
Linux 命令 `ar` 详解:静态库的管理利器
`ar` 命令是 Linux 管理静态库的工具,常用于创建、修改和提取 `.a` 文件。基本语法为 `ar [选项] 目标文件 [成员...]`。常用选项包括:`rcs` 创建(更新)静态库,`t` 列出成员,`x` 提取成员,`d` 删除成员。注意文件顺序、创建索引、备份和跨平台兼容性。学习和掌握 `ar` 命令能提升系统开发效率。
|
安全 网络安全 API
为什么黑客要攻击你的网站?如何保护网站再被攻击的情况下没有影响!!!!
2023年一季度报告显示,全球超1400万网站遭超10亿次攻击,网络安全风险上升。黑客攻击网站主要动机包括财务收益(如数据窃取、恶意软件传播)、服务中断、企业间谍、黑客行动主义、国家支持的攻击及私人原因。攻击手段涉及损坏的访问控制、开源组件的缺陷、服务器和客户端漏洞、API漏洞及共享主机风险。保护网站的措施包括持续扫描、渗透测试、同步测试与修补、集成WAAP到CI/CD、准备DDoS防御及使用垃圾邮件过滤。
|
Windows
Win10或Win11更新补丁后导致360随身wifi提示USB设备驱动异常,创建Wifi网络失败
Win10或Win11更新补丁后导致360随身wifi提示USB设备驱动异常,创建Wifi网络失败
4447 0
|
域名解析 缓存 Kubernetes
k8s教程(service篇)-Node本地DNS缓存
k8s教程(service篇)-Node本地DNS缓存
1122 0
k8s教程(service篇)-Node本地DNS缓存