`
yanfeijun
  • 浏览: 26039 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多
因为公司要使用cas,所以深入了解了一下.网上资料很多,各种原理就不累述了,说一下遇到的问题吧:

1.客户端版本选择
cas常用的有两个客户端,一个是老的耶鲁的,包名中有yale的;一个是cas client3版本,包名为jasig的。
yale版的登出好像没完全实现,不能够做到所有应用一齐登出,cas client3多一个single out filter来实现这个功能。
yale版的代理回调是通过配置servlet来处理的,cas client3通过在过滤器中处理。

相比较而言,yale的配置比较简单,网上的配置说明通常都是以yale版本为主,cas client3的配置可以看官网的wiki,https://wiki.jasig.org/display/CASC/CAS+Client+for+Java+3.1,不过是英文的,cas client3还可以使用spring来配置,这种配置方式我自己没实验过,可以看一下文档。

2.配置中的问题

第一个问题是证书中的域,因为我们是做政府应用的,通常没有域名,只能使用ip来进行域名认证,cas本身又不支持ip的域,只能改造cas的客户端,在调用connection的openconection之前,把默认的ssl处理handle设置为javax.net.ssl,并注入一个自定义的HostnameVerifier:
           System.setProperty("java.protocol.handler.pkgs", "javax.net.ssl");
            
            HostnameVerifier hv = new HostnameVerifier() {
                public boolean verify(String urlHostName, SSLSession session) {
                return urlHostName.equals(session.getPeerHost());
                }
           };
          
            HttpsURLConnection.setDefaultHostnameVerifier(hv);

cas client3中,以上代码加在AbstractCasProtocolUrlBasedTicketValidator的retrieveResponseFromServer方法中,我一直没找到默认的hostnameverifer实现,所以不知道为什么ip不能通过验证。

第二个是在weblogic中出现的,估计只是开发中才会出现的问题,证书太小,开发中通常都是自认证,所以会出现
FATAL Alert:BAD_CERTIFICATE - A corrupt or unuseable certificate was received.
解决方法,加入大小设置即可。

3.cas的代理认证
cas协议2.0加入了代理模式,在门户这种应用场景下相当的有用,网上的配置通常基于yale的客户端,cas client3的配置只有这篇文章有提及:http://fallenlord.blogbus.com/logs/57175888.html,但是其中有几个需要说明的proxyCallbackUrl和proxyReceptorUrl实际上是不需要我们自己开发的,yale版中回调有一个servlet的,新版本是在过滤器中处理掉的,这个地址可以自己随意定义,proxyCallbackUrl需要使用https协议,所以需要cas server端信任cas client的证书,具体配置方法就是在客户端生成证书,加入到服务器端的信任域中间去。

4.cas的登录页

在cas保护下的应用,在未登陆的时候,都会跳转到cas服务器上进行登录,理论上sso就是这个样子的,但是有时候客户会要求我在自己的页面登录,不要跳转到cas登录页,目前我没想到好的办法,我们采用了iframe嵌入cas登录页的方式来处理(ie下iframe会话有bug,google一下)。
贴一下我们的配置文件吧:
CasTest(代理模式的发起端)
<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://10.1.10.100:8443/cas/login</param-value>
        </init-param>
       <init-param>
        <param-name>renew</param-name>
        <param-value>false</param-value>
       </init-param>
       <init-param>
        <param-name>gateway</param-name>
        <param-value>false</param-value>
       </init-param>
       <init-param>
        <param-name>serverName</param-name>
        <param-value>http://10.1.10.100:8080</param-value>
       </init-param>

    </filter>
    <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>https://10.1.10.100:8443/cas/</param-value>
       </init-param>
       <init-param>
        <param-name>serverName</param-name>
        <param-value>http://10.1.10.100:8080</param-value>
       </init-param>
       <init-param>
        <param-name>useSession</param-name>
        <param-value>true</param-value>
       </init-param>
       <init-param>
        <param-name>redirectAfterValidation</param-name>
        <param-value>true</param-value>
       </init-param>
       <init-param>
         <param-name>acceptAnyProxy</param-name>
         <param-value>true</param-value>
       </init-param>
       <init-param>
        <param-name>proxyCallbackUrl</param-name>
        <param-value>https://10.1.10.100:8444/CasTest/proxy</param-value>
        </init-param>
        <init-param>
            <param-name>proxyReceptorUrl</param-name>
            <param-value>/proxy</param-value>
        </init-param>
    </filter> 
    <filter>
       <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
       <filter-class>
        org.jasig.cas.client.util.HttpServletRequestWrapperFilter
       </filter-class>
    </filter>
    <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 Validation Filter</filter-name>
       <url-pattern>/*</url-pattern>
    </filter-mapping>
    <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 HttpServletRequest Wrapper Filter</filter-name>
       <url-pattern>/*</url-pattern>
    </filter-mapping>

CasTest2(代理模式的服务提供端)
<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://10.1.10.100:8443/cas/login</param-value>
        </init-param>
       <init-param>
        <param-name>renew</param-name>
        <param-value>false</param-value>
       </init-param>
       <init-param>
        <param-name>gateway</param-name>
        <param-value>false</param-value>
       </init-param>
       <init-param>
        <param-name>serverName</param-name>
        <param-value>http://10.1.10.100:8080</param-value>
       </init-param>

    </filter>
    <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>https://10.1.10.100:8443/cas</param-value>
       </init-param>
       <init-param>
        <param-name>serverName</param-name>
        <param-value>http://10.1.10.100:8080</param-value>
       </init-param>
       <init-param>
        <param-name>useSession</param-name>
        <param-value>true</param-value>
       </init-param>
       <init-param>
        <param-name>redirectAfterValidation</param-name>
        <param-value>true</param-value>
       </init-param>
       <init-param>
        <param-name>acceptAnyProxy</param-name>
        <param-value>true</param-value>
    </init-param>
    </filter> 
    <filter>
       <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
       <filter-class>
        org.jasig.cas.client.util.HttpServletRequestWrapperFilter
       </filter-class>
    </filter>
    <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 HttpServletRequest Wrapper Filter</filter-name>
       <url-pattern>/*</url-pattern>
    </filter-mapping>
        <filter-mapping>
       <filter-name>CAS Validation Filter</filter-name>
       <url-pattern>/*</url-pattern>
    </filter-mapping>

分享到:
评论
3 楼 denger 2010-11-13  
lovechenxue 写道
在cas保护下的应用,在未登陆的时候,都会跳转到cas服务器上进行登录,理论上sso就是这个样子的,但是有时候客户会要求我在自己的页面登录,不要跳转到cas登录页,目前我没想到好的办法,我们采用了iframe嵌入cas登录页的方式来处理(ie下iframe会话有bug,google一下)。



这个简单  你可已自己写一个类  继续cas的filter  然后在这个类中判断哪些URL是需要跳转到SSO上验证的,哪些URL是不需要验证的(比如图片,css,js等)。


可实现方案,参考:http://denger.iteye.com/blog/809170
2 楼 yanfeijun 2010-11-01  
lovechenxue 写道
在cas保护下的应用,在未登陆的时候,都会跳转到cas服务器上进行登录,理论上sso就是这个样子的,但是有时候客户会要求我在自己的页面登录,不要跳转到cas登录页,目前我没想到好的办法,我们采用了iframe嵌入cas登录页的方式来处理(ie下iframe会话有bug,google一下)。



这个简单  你可已自己写一个类  继续cas的filter  然后在这个类中判断哪些URL是需要跳转到SSO上验证的,哪些URL是不需要验证的(比如图片,css,js等)。

不是这个问题啦,是说通常页面会有个跳转,有的用户嫌操作麻烦而已
1 楼 lovechenxue 2010-10-26  
在cas保护下的应用,在未登陆的时候,都会跳转到cas服务器上进行登录,理论上sso就是这个样子的,但是有时候客户会要求我在自己的页面登录,不要跳转到cas登录页,目前我没想到好的办法,我们采用了iframe嵌入cas登录页的方式来处理(ie下iframe会话有bug,google一下)。



这个简单  你可已自己写一个类  继续cas的filter  然后在这个类中判断哪些URL是需要跳转到SSO上验证的,哪些URL是不需要验证的(比如图片,css,js等)。

相关推荐

    H3C CAS总结.zip

    H3C CAS,里面有5个文件夹,分别是经验文件夹、配置案例、开局手册.。。。。。。。。。。。。。。。。。。。。。

    CAS网上的资料详细总结

    网上关于CAS的技术文章鱼龙混杂,我在这里整理出比较优秀和好用的文章,结合起来可以完成CAS的搭建

    CAS单点登录学习总结

    这是一份很珍贵的资料,即全面又详细,希望大家多支持

    sso系统CAS配置[总结].pdf

    sso系统CAS配置[总结].pdf

    cas实现单点登录服务端及客户端

    cas实现单点登录服务端及客户端,压缩包内提供三个工程,一个cas服务器,两个测试客户端,可同时部署到一个tomcat下,或者分开部署。端口号默认使用的8000

    开源ITSM工具itop接入单点登录框架cas实现步骤.docx

    开源ITSM工具iTop接入开源单点登录框架CAS的实现方法。踩了很多坑,一点一点地啃透了源码做出来的。总结出来的接入方法分享给大家,已经在本单位的实践中应用了,itop和cas都是目前官方最新版的。

    CasServer总结

    NULL 博文链接:https://mengyang.iteye.com/blog/689423

    Jave 面试 CAS就这?底层与原理与自旋锁

    CAS底层原理2.1 JMM内存模型(涉及到的知识点)2.2 CAS底层2.3 总结与应用三. 自旋锁SpinLock唉….刚写完了!别白嫖啊,点赞关注,给你们福利啊~~转载请标注! 好兄弟们,不会真有人看不懂CAS吧?反正我是没看懂… 一. CAS...

    今天会是有Offer的一天么:面试时不要再问我CAS和Synchronized的区别了

    那么今天就来做一个总结。 一. CAS 何为CAS。 CAS(Compare And Swap )是乐观锁的一种实现方式,是一种轻量级锁。JAVA1.5开始引入了CAS,JUC下很多工具类都是基于CAS。 CAS的实现方式 CAS有3个操作数,内存值V,...

    Java并发编程总结——慎用CAS详解

    下面小编就为大家带来一篇Java并发编程总结——慎用CAS详解。小编觉得挺不错的, 现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    红帽CSA与CE考试易错点总结

    该文章总结了考试过程中容易错的地方,是前辈辛苦总结的经验,这是每个考生必备必看的。

    Java源码,可运行的实战SpringBoot服务源码(实战中总结测试)

    「喜欢的自提」 可以直接运行的代码,里面是我在工作中用来学和和测试的代码,一般是得到想要的测试结果...16、CAS学习总结和测试 17、BIO、NIO、AIO、Reactor、netty相关学习总结和测试(客户端/服务端通信测试demo)

    各类锁的总结

    悲观锁和乐观锁,锁的思想的体现。体会一个很重要的概念:AQS和CAS

    一份超级详细的Java面试题【大厂面试真题+Java学习指南+工作总结】

    CAS乐观锁解决并发问题的一次实践 写代码有这些想法,同事才不会认为你是复制粘贴程序员 程序员必备:Java日期处理的十个坑 内存泄漏问题的分析和解决方案 程序员必备基础:加签验签 记一次接口性能优化实践总结:...

    E1帧结构 总结

    E1帧结构总结,包括基本原理,CRC复帧结构,CAS复帧结构等,对开始做通信相关的人有用

    03-05-28-阶段性总结1

    引入多线程之后,多线程对于集合类的操作,list、mapConcurrentHashMap(源码) -&gt; 思想的汲取(性能和安全性)元素个数的统计(cas肯定不

    Java高并发编程详解.md

    有关java高并发知识总结:三种线程创建方式 深入理解Thread构造函数 Thread API #### CAS缺陷 ##### 循环时间长开销大,自旋CAS如果长时间不成功,会给CPU带来非常大的执行开销。 ##### 只能保证一个共享变量...

    论文研究 - 目标基因组工程及其在作物性状改良中的应用

    位点特异性重组系统,锌指核酸酶(ZFN),转录激活因子样效应子核酸酶(TALEN)和成簇的规则间隔的短回文重复序列(CRISPR)/ CRISPR相关蛋白9核酸酶(Cas9)(CRISPR / Cas9)技术是是靶向基因组工程的代表,已...

    约翰H霍兰隐秩序-适应性造就复杂性.pdf

    《隐秩序:适应性造就复杂性》强调寻找支配CAS行为的一般...霍兰通过描述我们能够做什么,总结了如何增强对CAS的理论认识。他提出的若干理论方法,可以指导人们对付耗尽资源、置我们世界于危险境地的棘手的CAS问题。

    python的numpy模块安装不成功简单解决方法总结

    主要介绍了python的numpy模块安装不成功简单解决方法总结,分享了四种python模块导入不成功的解决方法,具有一定借鉴价值,需要的朋友可以参考下。

Global site tag (gtag.js) - Google Analytics