cas 6 单点登录登出管理
cas自带的登出是通过登出地址后面接的service地址进行跳转,但是对于service没有进行验证,这边我们网络渗透测试后说可能被钓鱼需要进行验证所以开始了以下操作。
1找资料
首先到cas官网找,发现项目有自带的是否跳转,跳转地址参数名称,跳转地址配置等数据
2.找代码 其中重点配置的是否跳转参数,我们知道java的bean可以将读取配置的-视为下一个字母大写,所以我在jar包中搜索followServiceRedirects
还有在实体类中看到需要引入包
所以在build.gradle中的dependencies下层次
加入
implementation "org.apereo.cas:cas-server-core-logout:${casServerVersion}"
具体位置如下
3.代码解读
圈中的地方为判断service地址是不是为空,并且followServiceRedirects为真 进行跳转
这就表明只要我们在这边加个查询 跳转的service是不是在自己的数据库里面就成,具体怎么做我就不赘述了,大家需求不同,因为我这边开始会将数据载入在servicesManager中 我直接读就行,我们来看看如何替换掉它,
其中点击方法发现只有3个地方有写到这个类,其中第一个是自身,后面两个来自一个启动配置
然后就看到这个bean 是新建这个类的东西,而且上面使用了@ConditionalOnMissingBean
也就是说只要我再写一个bean叫同一个名字,他就会加载我的了,所以我写了个config
继续点击方法看看引用
发现下面那个方法有加载,所以我重写了这俩到一个配置文件,并切新建了一个自定义规则的文件
package com.fgi.logout.cofig;import com.fgi.logout.strategy.CustomLogoutRedirectionStrategy;
import org.apereo.cas.authentication.principal.ServiceFactory;
import org.apereo.cas.configuration.CasConfigurationProperties;
import org.apereo.cas.logout.LogoutExecutionPlanConfigurer;
import org.apereo.cas.logout.LogoutRedirectionStrategy;
import org.apereo.cas.logout.config.CasCoreLogoutConfiguration;
import org.apereo.cas.logout.slo.SingleLogoutServiceLogoutUrlBuilder;
import org.apereo.cas.ticket.registry.TicketRegistry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @author LinZuo* @date 2023-06-07$ $*/
@Configuration("logoutRedirectionConfiguration")
public class LogoutRedirectionConfiguration {private static final Logger LOGGER = LoggerFactory.getLogger(SingleLogoutTriggerConfiguration.class);@Autowiredprivate CasCoreLogoutConfiguration casCoreLogoutConfiguration;@Autowiredprivate CasConfigurationProperties casProperties;@Autowired@Qualifier("ticketRegistry")private ObjectProvider<TicketRegistry> ticketRegistry;@Autowired@Qualifier("webApplicationServiceFactory")private ObjectProvider<ServiceFactory> webApplicationServiceFactory;@Autowired@Qualifier("singleLogoutServiceLogoutUrlBuilder")private ObjectProvider<SingleLogoutServiceLogoutUrlBuilder> singleLogoutServiceLogoutUrlBuilder;@Bean@RefreshScope@ConditionalOnMissingBean(name = "casCoreLogoutExecutionPlanConfigurer")public LogoutExecutionPlanConfigurer casCoreLogoutExecutionPlanConfigurer() {return plan -> {plan.registerSingleLogoutServiceMessageHandler(casCoreLogoutConfiguration.defaultSingleLogoutServiceMessageHandler());plan.registerLogoutRedirectionStrategy(defaultLogoutRedirectionStrategy());if (casProperties.getLogout().isRemoveDescendantTickets()) {LOGGER.debug("CAS is configured to remove descendant tickets of the ticket-granting tickets");plan.registerLogoutPostProcessor(ticketGrantingTicket -> ticketGrantingTicket.getDescendantTickets().forEach(t -> {LOGGER.debug("Deleting ticket [{}] from the registry as a descendant of [{}]", t, ticketGrantingTicket.getId());ticketRegistry.getObject().deleteTicket(t);}));}};}@Bean@RefreshScope@ConditionalOnMissingBean(name = "defaultLogoutRedirectionStrategy")public LogoutRedirectionStrategy defaultLogoutRedirectionStrategy() {return new CustomLogoutRedirectionStrategy(webApplicationServiceFactory.getObject(),casProperties.getLogout(), singleLogoutServiceLogoutUrlBuilder.getObject());}
}
package com.fgi.logout.strategy;import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.fgi.service.ServiceManagerUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.apache.commons.lang3.StringUtils;
import org.apereo.cas.authentication.principal.ServiceFactory;
import org.apereo.cas.authentication.principal.WebApplicationService;
import org.apereo.cas.configuration.model.core.logout.LogoutProperties;
import org.apereo.cas.logout.LogoutRedirectionStrategy;
import org.apereo.cas.logout.slo.SingleLogoutServiceLogoutUrlBuilder;
import org.apereo.cas.services.RegisteredService;
import org.apereo.cas.services.ServicesManager;
import org.apereo.cas.web.support.WebUtils;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.webflow.execution.RequestContext;import javax.annotation.Resource;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
/*** This is {@link CustomLogoutRedirectionStrategy}.** @author Misagh Moayyed* @since 6.3.0*/
@RequiredArgsConstructor
@Slf4j
public class CustomLogoutRedirectionStrategy implements LogoutRedirectionStrategy {private final ServiceFactory<WebApplicationService> webApplicationServiceFactory;private final LogoutProperties logoutProperties;private final SingleLogoutServiceLogoutUrlBuilder singleLogoutServiceLogoutUrlBuilder;@Resource@Qualifier("servicesManager")private ServicesManager servicesManager;@Overridepublic boolean supports(final RequestContext context) {return context != null;}@Overridepublic void handle(final RequestContext requestContext) {val request = WebUtils.getHttpServletRequestFromExternalWebflowContext(requestContext);val paramName = logoutProperties.getRedirectParameter();log.trace("Using parameter name [{}] to detect destination service, if any", paramName);val service = requestContext.getRequestParameters().get(paramName);log.trace("Located target service [{}] for redirection after logout", service);// 添加的代码 判断登出地址中是否有当前跳转的地址 sCollection<RegisteredService> list = servicesManager.getAllServices();List<String> serviceIds = ServiceManagerUtil.getServiceId(service);boolean exists = list.stream().anyMatch(s-> {if(CollectionUtil.isEmpty(serviceIds)){return false;}return StrUtil.isNotBlank(s.getLogoutUrl())&& s.getRedirectUrl().equals(serviceIds.get(0));});// 添加的代码 判断登出地址中是否有当前跳转的地址 eval authorizedRedirectUrlFromRequest = WebUtils.getLogoutRedirectUrl(request, String.class);if (StringUtils.isNotBlank(service) && logoutProperties.isFollowServiceRedirects()&&exists) {val webAppService = webApplicationServiceFactory.createService(service);if (singleLogoutServiceLogoutUrlBuilder.isServiceAuthorized(webAppService, Optional.of(request))) {log.debug("Redirecting to logout URL [{}]", service);WebUtils.putLogoutRedirectUrl(requestContext, service);} else {log.warn("Cannot redirect to [{}] given the service is unauthorized to use CAS. "+ "Ensure the service is registered with CAS and is enabled to allow access", service);}} else if (StringUtils.isNotBlank(authorizedRedirectUrlFromRequest)) {WebUtils.putLogoutRedirectUrl(requestContext, authorizedRedirectUrlFromRequest);} else {log.debug("No target service is located for redirection after logout, or following service redirects is disabled");}}
}
并且在H:\sso-server\src\main\resources\META-INF\spring.factories中添加加载
这样 就可以登出时候判断service跳转地址是不是自己想要的了。
cas 6 单点登录登出管理相关推荐
- java php 单点登陆,cas实现单点登录,登出(java跟php客户端)(转)
cas实现单点登录,登出(java跟php客户端)(转)cas实现单点登录,登出(java和php客户端) (转) 最近项目中需要做单点登录,客户端包含java和php,java有几个应用程序,php ...
- spring+shiro+cas实现单点登录,登出
cas.war下载地址:https://download.csdn.net/download/qq_37160920/10662543 1.下载cas.war,放在tomcat的 webapps下发布 ...
- 绝对完全跨域统一单点登录登出
应用场景:多个系统下同属于一个用户,当用户登录了web1系统,那么访问web2,web3. . . . 时候,用户就无需再次登录.如:淘宝与天猫,登出也如此,一个系统登出,其他系统的登录也随之失效,这 ...
- CAS 单点登录/登出 系统
前言: 在我们的实际开发中,更多的是采用分布式系统.那么问题来了,对于分布式系统的登录问题,我们如何解决呢? 如果说我们在每一个系统中都要进行一次登录,那么用户体验度也就差的没法用了.以京东商城为例, ...
- sso 登出_SSO单点登录/登出系统实现
先把源码贴出来,再慢慢讲解思路和原理以及实现方式 -->源代码1.0 整合了Mybatis +redis/redis集群二级缓存+cookie加密机制+token -->源代码2.1 密 ...
- SSM项目图书馆管理系统,适合新人练手和毕设参考,功能首页展示 系统注册登录登出 用户管理 权限控制管理 书籍管理 图书借阅管理 个人借阅记录管理 书籍详细信息展示等
图书馆管理系统,系统采用B/S架构 系统采用框架:java+maven+stringboot+mybatis+mysql-plus+boostart(前端界面) 首页展示 内容后台管理 菜单权限管理 ...
- 单点登录与权限管理本质:cookie安全问题
继续介绍「单点登录与权限管理」系列的第一部分:单点登录与权限管理本质,前一篇文章介绍了单点登录概念,以CAS协议的基本流程为例讲解了系统间的交互过程,过程中,cookie的设置和传输涉及的比较多,如何 ...
- cas java单点登录_java单点登录系统CAS的简单使用
http://blog.csdn.net/yunye114105/article/details/7997041 参考: http://blog.csdn.net/diyagea/article/de ...
- cas jwt 单点登录
单点登录是我比较喜欢的一个技术解决方案,一方面他能够提高产品使用的便利性,另一方面他分离了各个应用都需要的登录服务,对性能以及工作量都有好处.自从上次研究过JWT如何应用于会话管理,加之以前的项目中也 ...
最新文章
- 未来AI将会在这10个方向升级|腾讯优图联合厦大发布趋势预测
- Linux_Shell基础
- linux 32库路径,linux – 共享库如何在64位/ 32位混合系统中工作?
- Excel中将时间格式转化成时间戳格式
- OSChina 周日乱弹 ——局长才是真神
- java xml解析器_Java XML解析器
- 单片机音乐倒数计时器c语言,音乐倒数计时器单片机课程设计报告.doc
- Win10 LTSC 2021安装及相关bug解决
- MySQL - 安装教程详细图解
- Unity的AudioMixer真香?
- 第5节 vs中新建文件/筛选器/文件夹
- 2020年书法落款_书法落款的基本常识最新版
- 洛阳九县八取名字_洛阳市地图(洛阳市九县六区地图)
- java大文件pdf水印_java – 如何扩展PDF的页面大小以添加水印?
- 家里的垃圾移动光猫和tp路由器设置
- kerberos搭建
- 【CYH-02】noip2018数论模拟赛:比赛通知栏
- Kotlin | 委托(Delegation )详解
- 西游记中孙悟空为什么总是欺负捉弄嘲笑猪八戒?
- 关闭中国电信的绿色上网服务