CAS的service参数验证

打印 上一主题 下一主题

主题 884|帖子 884|积分 2652

CAS登录成功后会跳转到service参数提供的url,目前系统中这个参数是没有任何验证的,service参数随便赋一个网址就可以。为安全起见现在对这个service要作一下限制,比如只能是同源url才可以重定向。
下面是基于CAS 3.5.2对系统的改造过程。
系统比较老旧,之前也作过CAS方面的改造,基本思路是从login-webflow.xml中找到切入点,查看源代码,然后在配置文件中把相关的bean替换掉。具体分析过程这里不再赘述。
在argumentExtractorsConfiguration.xml中有
  1. <util:list id="argumentExtractors">
  2.     <ref bean="casArgumentExtractor" />
  3.     <ref bean="samlArgumentExtractor" />
  4. </util:list>
复制代码
把casArgumentExtractor替换成customArgumentExtractor。上面那个配置文件里再加上
  1. [/code]这个customArgumentExtractor就是要自己新写的。代码很简单,里面只有一个方法
  2. [code]public final class CustomArgumentExtractor extends AbstractSingleSignOutEnabledArgumentExtractor{
  3.     public WebApplicationService extractServiceInternal(HttpServletRequest request) {
  4.         return CustomWebApplicationServiceImpl.createServiceFrom(request,getHttpClientIfSingleSignOutEnabled());
  5.     }
  6. }
复制代码
CustomWebApplicationServiceImpl也是要自己写的,基于cas-server-core-3.5.2.jar里的SimpleWebApplicationServiceImpl上修改。
在里面的createServiceFrom方法加上验证即可
  1.     public static CustomWebApplicationServiceImpl createServiceFrom( <util:list id="argumentExtractors">
  2.     <ref bean="casArgumentExtractor" />
  3.     <ref bean="samlArgumentExtractor" />
  4. </util:list>  final HttpServletRequest request, final HttpClient httpClient)  {        final String targetService = request <util:list id="argumentExtractors">
  5.     <ref bean="casArgumentExtractor" />
  6.     <ref bean="samlArgumentExtractor" />
  7. </util:list>      .getParameter(CONST_PARAM_TARGET_SERVICE);        final String method = request.getParameter(CONST_PARAM_METHOD);        final String serviceToUse = StringUtils.hasText(targetService) <util:list id="argumentExtractors">
  8.     <ref bean="casArgumentExtractor" />
  9.     <ref bean="samlArgumentExtractor" />
  10. </util:list>      ? targetService : request.getParameter(CONST_PARAM_SERVICE);        if (!StringUtils.hasText(serviceToUse)) { <util:list id="argumentExtractors">
  11.     <ref bean="casArgumentExtractor" />
  12.     <ref bean="samlArgumentExtractor" />
  13. </util:list>  return null;        }        //新加的service同host验证---------------        try { <util:list id="argumentExtractors">
  14.     <ref bean="casArgumentExtractor" />
  15.     <ref bean="samlArgumentExtractor" />
  16. </util:list>  URI url = new URI(serviceToUse); <util:list id="argumentExtractors">
  17.     <ref bean="casArgumentExtractor" />
  18.     <ref bean="samlArgumentExtractor" />
  19. </util:list>  if (!host.equals(url.getHost())){ <util:list id="argumentExtractors">
  20.     <ref bean="casArgumentExtractor" />
  21.     <ref bean="samlArgumentExtractor" />
  22. </util:list>       return null; <util:list id="argumentExtractors">
  23.     <ref bean="casArgumentExtractor" />
  24.     <ref bean="samlArgumentExtractor" />
  25. </util:list>  }        } catch (URISyntaxException e) { <util:list id="argumentExtractors">
  26.     <ref bean="casArgumentExtractor" />
  27.     <ref bean="samlArgumentExtractor" />
  28. </util:list>  return null;        }        //---------------验证结束        final String id = cleanupUrl(serviceToUse);        final String artifactId = request.getParameter(CONST_PARAM_TICKET);        return new CustomWebApplicationServiceImpl(id, serviceToUse, <util:list id="argumentExtractors">
  29.     <ref bean="casArgumentExtractor" />
  30.     <ref bean="samlArgumentExtractor" />
  31. </util:list>      artifactId, "POST".equals(method) ? Response.ResponseType.POST <util:list id="argumentExtractors">
  32.     <ref bean="casArgumentExtractor" />
  33.     <ref bean="samlArgumentExtractor" />
  34. </util:list>      : Response.ResponseType.REDIRECT, httpClient);    }
复制代码
上面的host是配置文件里读的当前系统的域名。这里可以加自己的其他验证逻辑,比如二级子目录、通配符域名或者白名单列表。
 
最后还要修改一个地方,在uniqueIdGenerators.xml里
  1. <util:list id="argumentExtractors">
  2.     <ref bean="casArgumentExtractor" />
  3.     <ref bean="samlArgumentExtractor" />
  4. </util:list> <util:list id="argumentExtractors">
  5.     <ref bean="casArgumentExtractor" />
  6.     <ref bean="samlArgumentExtractor" />
  7. </util:list>
  8. ......
复制代码
把SimpleWebApplicationServiceImpl换成CustomWebApplicationServiceImpl。
 
这样修改之后,当service参数的url跟你配置的域名不一致时,等同于service为null,即未配置。在我的系统里会跳转到一个只是简单提示登录成功的jsp页面。
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

民工心事

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表