昨天发了一个相关的帖子,没有一个回复,很觉得奇怪.但也没办法,要用啊,还是希望能遇到用过yale cas的网友给予支持.有下面几个问题:
1.yale cas如何实现多个web应用之间的单点登录2.yale cas能不能实现多浏览器间的web应用的单点登录?3.yale cas服务器到底保存了什么?从日志中可以看到生成的st ticket马上被删除了,而且是同一条线程.4.如果多个web应用之间可以实现单点登录,那么一定是通过cookie共享信息了?
谢谢

解决方案 »

  1.   

    CAS网站其实有说明吧实际上过程大致如下,1、用户访问Web应用
    2、Web应用的CAS过滤器判断用户未登录,跳转到CAS登录页面
    3、用户登录CAS服务器
    4、CAS带着一个Token跳转到Web应用
    5、Web应用根据得到的Token向CAS服务器验证合法性,合法则登录成功你的问题
    1.yale cas如何实现多个web应用之间的单点登录
    实际上是传递一个临时性的Token(短时间内有效)2.yale cas能不能实现多浏览器间的web应用的单点登录?
    不清楚你指多浏览器是什么意思,关键是登录成功后Token是随机的,你另外开一个浏览器不会有这个Token3.yale cas服务器到底保存了什么?从日志中可以看到生成的st ticket马上被删除了,而且是同一条线程.
    CAS服务器保持了这个Token一段时间4.如果多个web应用之间可以实现单点登录,那么一定是通过cookie共享信息了?
    是通过URL参数传递的Token的
      

  2.   

    1.yale cas如何实现多个web应用之间的单点登录
    第一次登陆成功的时候,往浏览器的cookie里面放ticketgrantingticket对象的id了
    以后就根据这个来判断2.yale cas能不能实现多浏览器间的web应用的单点登录?
    没啥问题,只要都支持cookie的读写就行
    你写的时候稍微注意下cookie老协议的限定字符就可以了
    不修改cas自己的生成逻辑一般没有啥问题
    3.yale cas服务器到底保存了什么?从日志中可以看到生成的st ticket马上被删除了,而且是同一条线程.
    保存两个东西 一个是ticketgrantingticket对象这个能在服务端存放7200秒
    一个是serviceticket对象,放300秒,而且只能验证一次,完了不论是验证成功还是失败都直接删除
    以上数据均为其某版本默认配置
    4.如果多个web应用之间可以实现单点登录,那么一定是通过cookie共享信息了
    这个不一定
    共享cookie信息要在顶级域名相同的基础上才能行
    如果顶级域名不同
    cookie必然行不通我博客里面有些关于cas的介绍文章,可以参考
    不算广告吧
      

  3.   


    3.CAS服务器保持了多久呢? 据我的调试,一个应用登录完成后,tocken马上就被删除了,这样的话,下一个带着同样token的应用在CAS服务器岂不是没有任何标记,如何不用再次登录.4.比如有两个应用A,B.我在A应用登录成功后,然后在同一浏览器地址栏直接输入应用B中受保护的页面的URL(没有带token),这样的话岂不是还要再登录,因为URL没有带任何关于已经登录的信息.
      

  4.   

    3.CAS服务器保持了多久呢? 据我的调试,一个应用登录完成后,tocken马上就被删除了,这样的话,下一个带着同样token的应用在CAS服务器岂不是没有任何标记,如何不用再次登录.
    //每次都是CAS重新生成新的Token登录这个应用的,所以不需要继续保持。带着同样token就表示非法登录了4.比如有两个应用A,B.我在A应用登录成功后,然后在同一浏览器地址栏直接输入应用B中受保护的页面的URL(没有带token),这样的话岂不是还要再登录,因为URL没有带任何关于已经登录的信息.
    //当然,因为没有通过CAS,B应用根本没有登录我的tomcat下面有三个应用blog,blog1,cas,当我第一次登录成功后会多一个tgt cookie,路径是/cas.
    /cas这个路径blog,blog1是使用不了的吧?
    有什么办法让blog,blog1都能使用这个tgt cookie呢?
    //不可以,也没有任何必要
    浏览器间共享cookie?FireFox与IE间能行吗?
    cookie行不通的话,还有什么办法?//再说一次,CAS的机制是通过Token传递的,不是Cookie。每一个应用登录实际上都是要求CAS生成一个新的Token
      

  5.   


    我的理解,最根本的CAS服务器一定要维护着已经登录应用(用户)的名单(标记).你上面说的token,如何在不同应用间共享,是我最不明白的问题
    上面说到的blog,blog2没有必要共享cookie,那么blog登录后,blog2怎么实现不用再次登录?按我的想法,blog登录成功后在CAS服务器上有一个标记,然后向浏览器写了一个cookie,
    然后访问blog2时共享了这个cookie,提交到CAS服务器检查已经登录,所以不用再次登录了.
    不知道以上理解是否有误?
    谢谢
      

  6.   

    你配置好CAS,自然会完成跳转过程啊。应用中的CAS的Filter会判断用户没有登录,然后自动跳转到CAS登录页面,登录后则再自动带Token回到应用中,应用中的CAS的Filter会验证这个Token的合法性,如果验证通过则表示登录成功。中间的跳转不需要你自己做的
      

  7.   


    很重要的是,我现在实现不了多应用单的单点登录,所以才会有以上问题.
    不管它怎么跳转,原理要弄明白先.ps:不得不说,csdn论坛功能实现有限,不能直接上图,用url上还不会缩小图片
      

  8.   

    用 json 的方式就行了 cas 判定用户是合法用户后 会将用户的用户信息包括权限信息 一起以json的方式发给用户目标访问的web应用
      

  9.   

    很重要的是,我现在实现不了多应用单的单点登录,所以才会有以上问题.
    不管它怎么跳转,原理要弄明白先.====
    CAS应该可以支持啊,但是前提是CAS服务器必须是HTTPS的,否则好像默认不支持
    原理很简单啊,你访问BLOG2的时候,CAS Filter判断用户没有登录,所以先跳转到了CAS登录页面。
    CAS登录页面发现用户已经登录了,则生成blog2的Token然后跳转到BLOB2中。
    BLOG2中的CAS Filter验证这个Token是合法的。
    成功登录,继续访问
      

  10.   


    我说,默认的CAS哪来的权限信息,哪来的JSON???
      

  11.   

    我怀疑你是没有使用HTTPS,如果你使用的CAS服务器不是HTTPS的,必须修改
    CAS服务器上的ticketGrantingTicketCookieGenerator.xml文件中p:cookieSecure="false"
      

  12.   


    有一点重要的,blog2怎么判断请求是已经登录的还是尚未登录的?程序实现的话最终会是这样:
    if(something){
       已经登录
    }else{
        尚未登录;
        跳转到认证服务器.
    }
    其中something是什么?
      

  13.   

    1.用cookie实现的话,
    不需要应用服务器重定向,在浏览器地址栏直接输入URL即可,因为token在cookie中.
    要解决的问题就是cookie跨域的问题2.用服务器端session实现的话
    应用A认证成功后,把token保存在session中,应用A把在指向应用B的友情链接挂上token
    用户只能使用应用A提供的链接才能实现单点登录,如果直接在浏览器地址栏输入的话是还要重新登录的不知道上面总结的对不对,请大家指教.Yale CAS 使用的是哪种方式?
      

  14.   

    something 是 session.getAttribute(...);存在Attribute名字我忘记了。反正是一个字符串值
    CAS用的是Session的方式
      

  15.   


    你还是没明白我的意思.
    你在应用A登录成功了,然后应用A的Session中有一个attr.
    然后你在地址栏输入http://blog2,向应用B发出请求,在应用B的Session中是没有attr的,也就是没登录了.
      

  16.   

    没有错,应用B是没有登录,所以应用B要求了浏览器跳转到CAS服务器的登录页面了。
    但是由于你曾经访问过CAS服务器(登录应用A时),再次访问CAS服务器时浏览器会自动带上CAS服务器对应的Cookie,这个时候CAS服务器就知道你已经登录过。CAS服务器就不再需要你输入用户名、密码。而是直接生成应用B的Token然后跳转回到应用B的服务器上
    也就是你访问http://blob2时,服务器首先要求你跳转http://casserver/cas/login...,然后CAS服务器马上就再要求再跳转到http://blob2?token=...上,这样应用B就可以成功登录了
      

  17.   


    明白了,原来是这样,难怪有一个cookie的path是/cas
    可是为什么,我的还是要登录呢?
    跳转是存在的,但跳转后是到了登录页面.
      

  18.   

    我的是不会的。你尝试修改ticketGrantingTicketCookieGenerator.xml中p:cookieSecure="false",重启一下CAS服务器试试吧。
      

  19.   

    <init-param>
         <param-name>edu.yale.its.tp.cas.client.filter.renew</param-name>
         <param-value>false</param-value>
        </init-param>原来是这个,我前配置的是true
    哎.... 终于搞定了,谢谢你,高手.
    不过,问题还是有的
    1.浏览器间应该不可能实现单点登录吧
    2.桌面应用与web应用间怎么实现单点登录,有什么方案.
      

  20.   

    不同浏览器之间基本上是不行的。
    除非你自己在CAS服务器之上再增加一个根据客户端IP维持Cookie的Filter之类其实我觉得一般用户也能接受吧
      

  21.   


    那么,桌面到浏览器,怎么实现?
    桌面应用程序模拟浏览器,先得到tgt?
      

  22.   

    新的问题又来了,无法注销
    <init-param>
            <param-name>edu.yale.its.tp.cas.client.filter.renew</param-name>
            <param-value>false</param-value>
        </init-param>
    之前是true时,是可以注销的.我是用一个servlet进行注销的,代码如下
    protected void doGet(HttpServletRequest request,
    HttpServletResponse response) throws ServletException, IOException {
    System.out.println("    注销 LogoutServlet.doGet()");
    request.getSession().invalidate();
    response.sendRedirect("http://pcenshao:8080/cas/logout?service=http://pcenshao:8080/blog/");
    }