首页 > 其他分享 >CAS的service参数验证

CAS的service参数验证

时间:2023-04-23 14:24:26浏览次数:38  
标签:return String service 验证 CAS request CustomWebApplicationServiceImpl final

CAS登录成功后会跳转到service参数提供的url,目前系统中这个参数是没有任何验证的,service参数随便赋一个网址就可以。为安全起见现在对这个service要作一下限制,比如只能是同源url才可以重定向。

下面是基于CAS 3.5.2对系统的改造过程。

系统比较老旧,之前也作过CAS方面的改造,基本思路是从login-webflow.xml中找到切入点,查看源代码,然后在配置文件中把相关的bean替换掉。具体分析过程这里不再赘述。

在argumentExtractorsConfiguration.xml中有

 <util:list id="argumentExtractors">
    <ref bean="casArgumentExtractor" />
    <ref bean="samlArgumentExtractor" />
 </util:list>

把casArgumentExtractor替换成customArgumentExtractor。上面那个配置文件里再加上

<bean id="customArgumentExtractor"
   class="org.jasig.cas.web.support.CustomArgumentExtractor"
     p:httpClient-ref="noRedirectHttpClient"
     p:disableSingleSignOut="${slo.callbacks.disabled:false}" />

这个customArgumentExtractor就是要自己新写的。代码很简单,里面只有一个方法

public final class CustomArgumentExtractor extends AbstractSingleSignOutEnabledArgumentExtractor{

    public WebApplicationService extractServiceInternal(HttpServletRequest request) {
        return CustomWebApplicationServiceImpl.createServiceFrom(request,getHttpClientIfSingleSignOutEnabled());
    }
}

CustomWebApplicationServiceImpl也是要自己写的,基于cas-server-core-3.5.2.jar里的SimpleWebApplicationServiceImpl上修改。

在里面的createServiceFrom方法加上验证即可

    public static CustomWebApplicationServiceImpl createServiceFrom(
            final HttpServletRequest request, final HttpClient httpClient)  {
        final String targetService = request
                .getParameter(CONST_PARAM_TARGET_SERVICE);
        final String method = request.getParameter(CONST_PARAM_METHOD);
        final String serviceToUse = StringUtils.hasText(targetService)
                ? targetService : request.getParameter(CONST_PARAM_SERVICE);

        if (!StringUtils.hasText(serviceToUse)) {
            return null;
        }

        //新加的service同host验证---------------
        try {
            URI url = new URI(serviceToUse);
            if (!host.equals(url.getHost())){ 
                return null;
            }
        } catch (URISyntaxException e) {
            return null;
        }
        //---------------验证结束

        final String id = cleanupUrl(serviceToUse);
        final String artifactId = request.getParameter(CONST_PARAM_TICKET);

        return new CustomWebApplicationServiceImpl(id, serviceToUse,
                artifactId, "POST".equals(method) ? Response.ResponseType.POST
                : Response.ResponseType.REDIRECT, httpClient);
    }

上面的host是配置文件里读的当前系统的域名。这里可以加自己的其他验证逻辑,比如二级子目录、通配符域名或者白名单列表。

 

最后还要修改一个地方,在uniqueIdGenerators.xml里

    <util:map id="uniqueIdGeneratorsMap">
        <entry
            key="org.jasig.cas.authentication.principal.SimpleWebApplicationServiceImpl"
            value-ref="serviceTicketUniqueIdGenerator" />
        <entry
            key="org.jasig.cas.support.openid.authentication.principal.OpenIdService"
            value-ref="serviceTicketUniqueIdGenerator" />
......

把SimpleWebApplicationServiceImpl换成CustomWebApplicationServiceImpl。

 

这样修改之后,当service参数的url跟你配置的域名不一致时,等同于service为null,即未配置。在我的系统里会跳转到一个只是简单提示登录成功的jsp页面。

 

标签:return,String,service,验证,CAS,request,CustomWebApplicationServiceImpl,final
From: https://www.cnblogs.com/lichdr/p/17346151.html

相关文章

  • Unable to tunnel through proxy. Proxy returns "HTTP/1.1 503 Service Unavailable
    背景:某日,一正常项目迁移到新的服务器新的服务器,需要使用代理来访问之前能直接访问的接口,加完代理之后,发现无法获取数据了报错:org.springframework.web.client.ResourceAccessException:I/OerroronGETrequestfor"https://xxxxxxxxxx/xxxx":Unabletotunne......
  • 使用ServiceSelf解决.NET应用程序做服务的难题
    1ServiceSelf为.NET泛型主机的应用程序提供自安装为服务进程的能力,支持windows和linux平台。功能自我服务安装自我服务卸载自我服务日志监听2自我服务安装虽然.NetCore提供了Microsoft.Extensions.Hosting.Systemd和Microsoft.Extensions.Hosting.WindowsServices两......
  • vue3 create-vue 开启vite自动验证eslint
    0.vue3 cli推荐新的构建工具vite,但没有yarnrundev后并不自动检测eslint规则,需要运行yarnruneslint1.添加组件即可 yarnadd vite-plugin-eslint--dev 2.在vite.config.js加入1import{fileURLToPath,URL}from'node:url'23import{defineConfig}......
  • android 前台保活 service
    引用:https://blog.csdn.net/qq_34195507/article/details/1036343961.DeskService前台服务packagecom.cpsc.livedemo;importandroid.app.Notification;importandroid.app.NotificationManager;importandroid.app.Service;importandroid.content.Intent;importandr......
  • golang net/rpc inject data to service function
    在golang中,net/rpc库比较牛,只需要写函数,然后使用现成的ServerCodec就可以完成rpc服务了。但是有个问题,service函数的参数都是来自客户端的,如果服务器想为某个特殊的函数注入一些配置或状态参数,就不好弄了。解决方案:修改service函数,比如原来的参数是FuncArgs结构体,现在改成t......
  • 开始学习《SytemVerilog验证测试平台编写指南》
    我使用ModelSim的Starter版学习,在这一段代码上报错:moduleTestArray;intj=1,q2[$]={3,4},q[$]={0,2,5};initialbegin //q.insert(1,j); //q.insert(3,q2); q.delete(1); q.push_front(6); j=q.pop_back; $display(j); q.push_back(8);j=q.pop_......
  • 读书笔记 - 《Monolith to Microservices》
    如果你的产品目前是B/S或者C/S架构,想要考虑重构成微服务,这本书绝对是一个很好的参考,作者通过自己的实践经历,详述了以下几个方面:不要因为别人都做微服务,你就想要把自己的系统转成微服务,首先需要分析自己系统碰到的问题,找到最适合的解决办法,微服务不是万能的,不能解决所有问题考虑......
  • 06添加身份验证
    06添加身份验证Domain.Shared添加Nugget包:Volo.Abp.PermissionManagement.Domain.SharedVolo.Abp.Identity.Domain.SharedVolo.Abp.OpenIddict.Domain.SharedDomainSharedModule.cs添加以下依赖:typeof(AbpIdentityDomainSharedModule)typeof(AbpPermissionManagementD......
  • 【汇智学堂】-Hadoop分布式集群安装验证-3(检查YARN)
    在HadoopMaster上启动Firefox浏览器,输入http://master:18088/,检查YARN是否正常,如下图则为正常。......
  • 【汇智学堂】-Hadoop分布式集群安装验证-2(WEB UI查看)
    在HadoopMaster上启动Firefox浏览器,输入http://master:50070/,检查NameNode和DataNode是否正常,如下图则为正常。......