精华内容
下载资源
问答
  • CAS实现sso单点登录原理,可以方便技术人员理解
  • CAS单点登录原理解析

    千次阅读 2019-05-17 11:16:48
    推荐阅读 1.SpringBoot 整合篇 ...基于Cookie的单点登录核心原理: 将用户名密码加密之后存于Cookie中,之后访问网站时在过滤器(filter)中校验用户权限,如果没有权限则从Cookie中取出用户名...

    1. SpringBoot 整合篇

    2. 手写一套迷你版HTTP服务器

    3. 记住:永远不要在MySQL中使用UTF-8

    4. Springboot启动原理解析

    1、基于Cookie的单点登录的回顾

    CAS单点登录原理解析

    基于Cookie的单点登录核心原理:

    将用户名密码加密之后存于Cookie中,之后访问网站时在过滤器(filter)中校验用户权限,如果没有权限则从Cookie中取出用户名密码进行登录,让用户从某种意义上觉得只登录了一次。

    该方式缺点就是多次传送用户名密码,增加被盗风险,以及不能跨域。同时www.qiandu.com与mail.qiandu.com同时拥有登录逻辑的代码,如果涉及到修改操作,则需要修改两处。

    2、统一认证中心方案原理

    在生活中我们也有类似的相关生活经验,例如你去食堂吃饭,食堂打饭的阿姨(www.qiandu.com)告诉你,不收现金。并且告诉你,你去门口找换票的(passport.com)换小票。于是你换完票之后,再去找食堂阿姨,食堂阿姨拿着你的票,问门口换票的,这个票是真的吗?换票的说,是真的,于是给你打饭了。

    基于上述生活中的场景,我们将基于Cookie的单点登录改良以后的方案如下:

    CAS单点登录原理解析

    经过分析,Cookie单点登录认证太过于分散,每个网站都持有一份登陆认证代码。于是我们将认证统一化,形成一个独立的服务。当我们需要登录操作时,则重定向到统一认证中心http://passport.com。于是乎整个流程就如上图所示:

    第一步:用户访问www.qiandu.com。过滤器判断用户是否登录,没有登录,则重定向(302)到网站http://passport.com。
    第二步:重定向到passport.com,输入用户名密码。passport.com将用户登录的信息记录到服务器的session中。
    第三步:passport.com给浏览器发送一个特殊的凭证,浏览器将凭证交给www.qiandu.com,www.qiandu.com则拿着浏览器交给他的凭证去passport.com验证凭证是否有效,从而判断用户是否登录成功。
    第四步:登录成功,浏览器与网站之间进行正常的访问。

    3、Yelu大学研发的CAS(Central Authentication Server)

    下面就以耶鲁大学研发的CAS为分析依据,分析其工作原理。首先看一下最上层的项目部署图:

    CAS单点登录原理解析

    部署项目时需要部署一个独立的认证中心(cas.qiandu.com),以及其他N个用户自己的web服务。

    认证中心:也就是cas.qiandu.com,即cas-server。用来提供认证服务,由CAS框架提供,用户只需要根据业务实现认证的逻辑即可。

    用户web项目:只需要在web.xml中配置几个过滤器,用来保护资源,过滤器也是CAS框架提供了,即cas-client,基本不需要改动可以直接使用。

    4、CAS的详细登录流程

    CAS单点登录原理解析

    上图是3个登录场景,分别为:第一次访问www.qiandu.com、第二次访问、以及登录状态下第一次访问mail.qiandu.com。

    下面就详细说明上图中每个数字标号做了什么,以及相关的请求内容,响应内容。

    4.1、第一次访问www.qiandu.com

    标号1:用户访问http://www.qiandu.com,经过他的第一个过滤器(cas提供,在web.xml中配置)AuthenticationFilter。

    过滤器全称:org.jasig.cas.client.authentication.AuthenticationFilter

    主要作用:判断是否登录,如果没有登录则重定向到认证中心。

    标号2:www.qiandu.com发现用户没有登录,则返回浏览器重定向地址。

    CAS单点登录原理解析

    首先可以看到我们请求www.qiandu.com,之后浏览器返回状态码302,然后让浏览器重定向到cas.qiandu.com并且通过get的方式添加参数service,该参数目的是登录成功之后会要重定向回来,因此需要该参数。并且你会发现,其实server的值就是编码之后的我们请求www.qiandu.com的地址。

    标号3:浏览器接收到重定向之后发起重定向,请求cas.qiandu.com。

    标号4:认证中心cas.qiandu.com接收到登录请求,返回登陆页面。

    CAS单点登录原理解析

    上图就是标号3的请求,以及标号4的响应。请求的URL是标号2返回的URL。之后认证中心就展示登录的页面,等待用户输入用户名密码。

    标号5:用户在cas.qiandu.com的login页面输入用户名密码,提交。

    标号6:服务器接收到用户名密码,则验证是否有效,验证逻辑可以使用cas-server提供现成的,也可以自己实现。

    CAS单点登录原理解析

    上图就是标号5的请求,以及标号6的响应了。当cas.qiandu.com即csa-server认证通过之后,会返回给浏览器302,重定向的地址就是Referer中的service参数对应的值。后边并通过get的方式挟带了一个ticket令牌,这个ticket就是ST(数字3处)。同时会在Cookie中设置一个CASTGC,该cookie是网站cas.qiandu.com的cookie,只有访问这个网站才会携带这个cookie过去。

    Cookie中的CASTGC:向cookie中添加该值的目的是当下次访问cas.qiandu.com时,浏览器将Cookie中的TGC携带到服务器,服务器根据这个TGC,查找与之对应的TGT。从而判断用户是否登录过了,是否需要展示登录页面。TGT与TGC的关系就像SESSION与Cookie中SESSIONID的关系。

    • TGT:Ticket Granted Ticket(俗称大令牌,或者说票根,他可以签发ST)

    • TGC:Ticket Granted Cookie(cookie中的value),存在Cookie中,根据他可以找到TGT。

    • ST:Service Ticket (小令牌),是TGT生成的,默认是用一次就生效了。也就是上面数字3处的ticket值。

    标号7:浏览器从cas.qiandu.com哪里拿到ticket之后,就根据指示重定向到www.qiandu.com,请求的url就是上面返回的url。

    CAS单点登录原理解析

    标号8:www.qiandu.com在过滤器中会取到ticket的值,然后通过http方式调用cas.qiandu.com验证该ticket是否是有效的。

    标号9:cas.qiandu.com接收到ticket之后,验证,验证通过返回结果告诉www.qiandu.com该ticket有效。

    标号10:www.qiandu.com接收到cas-server的返回,知道了用户合法,展示相关资源到用户浏览器上。

    CAS单点登录原理解析

    至此,第一次访问的整个流程结束,其中标号8与标号9的环节是通过代码调用的,并不是浏览器发起,所以没有截取到报文。

    4.2、第二次访问www.qiandu.com

    上面以及访问过一次了,当第二次访问的时候发生了什么呢?

    标号11:用户发起请求,访问www.qiandu.com。会经过cas-client,也就是过滤器,因为第一次访问成功之后www.qiandu.com中会在session中记录用户信息,因此这里直接就通过了,不用验证了。

    标号12:用户通过权限验证,浏览器返回正常资源。

    4.3、访问mail.qiandu.com

    标号13:用户在www.qiandu.com正常上网,突然想访问mail.qiandu.com,于是发起访问mail.qiandu.com的请求。

    标号14:mail.qiandu.com接收到请求,发现第一次访问,于是给他一个重定向的地址,让他去找认证中心登录。

    CAS单点登录原理解析

    上图可以看到,用户请求mail.qiandu.com,然后返回给他一个网址,状态302重定向,service参数就是回来的地址。

    标号15:浏览器根据14返回的地址,发起重定向,因为之前访问过一次了,因此这次会携带上次返回的Cookie:TGC到认证中心。

    标号16:认证中心收到请求,发现TGC对应了一个TGT,于是用TGT签发一个ST,并且返回给浏览器,让他重定向到mail.qiandu.com

    CAS单点登录原理解析

    可以发现请求的时候是携带Cookie:CASTGC的,响应的就是一个地址加上TGT签发的ST也就是ticket。

    标号17:浏览器根据16返回的网址发起重定向。

    标号18:mail.qiandu.com获取ticket去认证中心验证是否有效。

    标号19:认证成功,返回在mail.qiandu.com的session中设置登录状态,下次就直接登录。

    标号20:认证成功之后就反正用想要访问的资源了。

    CAS单点登录原理解析

    5、总结

    至此,CAS登录的整个过程就完毕了,以后有时间总结下如何使用CAS,并运用到项目中。

    CAS单点登录原理解析

     

    作者:你明哥

    cnblogs.com/lihuidu/p/6495247.html

    CAS单点登录原理解析

    展开全文
  • CAS实现单点登录原理

    千次阅读 2018-10-25 20:23:47
    CAS框架:CAS(Central Authentication Service)是实现SSO单点登录的框架。 2、盗一张学习CAS绝大多都看过的图以及执行部分分析 注:已分不清原创,此处就不给出地址了。 从结构上看,CAS...

    一、不落俗套的开始

    1、背景介绍

    单点登录:Single Sign On,简称SSO,SSO使得在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    CAS框架:CAS(Central Authentication Service)是实现SSO单点登录的框架。

    2、盗一张学习CAS绝大多都看过的图以及执行部分分析

    注:已分不清原创,此处就不给出地址了。

    这里写图片描述

    从结构上看,CAS包含两个部分:CAS Server 和CAS Client需要独立部署,主要负责对用户的认证工作;CAS
    Client负责处理对客户端受保护资源的访问请求,需要登录时,重定向到CAS Server.图1是CAS最基本的协议过程:

    CAS Client 与受保护的客户端应用部署在一起,以Filter方式保护 Web 应用的受保护资源,过滤从客户端过来的每一个 Web
    请求,同时, CAS Client会分析HTTP 请求中是否包请求 Service Ticket( 上图中的 Ticket)
    ,如果没有,则说明该用户是没有经过认证的,于是,CAS Client会重定向用户请求到CAS Server( Step 2 )。 Step
    3是用户认证过程,如果用户提供了正确的Credentials, CAS Server 会产生一个随机的 Service Ticket
    ,然后,缓存该 Ticket ,并且重定向用户到CAS Client(附带刚才产生的Service Ticket), Service
    Ticket 是不可以伪造的,最后, Step 5 和 Step6是 CAS Client 和 CAS
    Server之间完成了一个对用户的身份核实,用Ticket查到 Username ,因为 Ticket是 CAS Server
    产生的,因此,所以 CAS Server 的判断是毋庸置疑的。

    该协议完成了一个很简单的任务,所有与CAS的交互均采用SSL协议,确保ST和TGC的安全性。协议工作过程会有2此重定向过程,但是CAS
    Client与CAS Server之间进行ticket验证的过程对于用户是透明的。

    总结一下,如下:

    访问服务: SSO 客户端发送请求访问应用系统提供的服务资源。

    定向认证: SSO 客户端会重定向用户请求到 SSO 服务器。

    用户认证:用户身份认证。

    发放票据: SSO 服务器会产生一个随机的 Service Ticket 。

    验证票据: SSO 服务器验证票据 Service Ticket 的合法性,验证通过后,允许客户端访问服务。

    传输用户信息: SSO 服务器验证票据通过后,传输用户认证结果信息给客户端。

    二、在云里雾里进一步搜索、探究

    先给出此部分内容出处: 《SSO CAS单点系列》之 实现一个SSO认证服务器是这样的,以下标红部分为自己的疑问。

    1、登录信息传递

    这里写图片描述
    用户首次登录时流程如下:

    1)、用户浏览器访问系统A需登录受限资源,此时进行登录检查,发现未登录,然后进行获取票据操作,发现没有票据。

    2)、系统A发现该请求需要登录,将请求重定向到认证中心,获取全局票据操作,没有,进行登录。

    3)、认证中心呈现登录页面,用户登录,登录成功后,认证中心重定向请求到系统A,并附上认证通过令牌,此时认证中心同时生成了全局票据。

    4)、此时再次进行登录检查,发现未登录,然后再次获取票据操作,此时可以获得票据(令牌),系统A与认证中心通信,验证令牌有效,证明用户已登录。

    5)、系统A将受限资源返给用户。

    这里写图片描述
    已登录用户首次访问应用群中系统B时:

    1)、浏览器访问另一应用B需登录受限资源,此时进行登录检查,发现未登录,然后进行获取票据操作,发现没有票据。

    2)、系统B发现该请求需要登录,将请求重定向到认证中心,获取全局票据操作,获取全局票据,可以获得,认证中心发现已经登录

    3)、认证中心发放临时票据(令牌),并携带该令牌重定向到系统B。

    4)、此时再次进行登录检查,发现未登录,然后再次获取票据操作,此时可以获得票据(令牌),系统B与认证中心通信,验证令牌有效,证明用户已登录。

    5)、系统B将受限资源返回给客户端。

    2、登录状态判断

    用户到认证中心登录后,用户和认证中心之间建立起了会话,我们把这个会话称为全局会话。当用户后续访问系统应用时,我们不可能每次应用请求都到认证中心去判定是否登录,这样效率非常低下,这也是单Web应用不需要考虑的。

    我们可以在系统应用和用户浏览器之间建立起局部会话,局部会话保持了客户端与该系统应用的登录状态,局部会话依附于全局会话存在,全局会话消失,局部会话必须消失。

    用户访问应用时,首先判断局部会话是否存在,如存在,即认为是登录状态,无需再到认证中心去判断。如不存在,就重定向到认证中心判断全局会话是否存在,如存在,按1提到的方式通知该应用,该应用与客户端就建立起它们之间局部会话,下次请求该应用,就不去认证中心验证了。

    3、登出

    用户在一个系统登出了,访问其它子系统,也应该是登出状态。要想做到这一点,应用除结束本地局部会话外,还应该通知认证中心该用户登出。

    认证中心接到登出通知,即可结束全局会话,同时需要通知所有已建立局部会话的子系统,将它们的局部会话销毁。这样,用户访问其它应用时,都显示已登出状态。

    整个登出流程如下:

    1)、客户端向应用A发送登出Logout请求。
    2)、应用A取消本地会话,同时通知认证中心,用户已登出。
    3)、应用A返回客户端登出请求。
    4)、认证中心通知所有用户登录访问的应用,用户已登出。

    三、拨开云雾见青天

    1、对上面所有标红疑问一一解释

    1)、问:系统A是如何发现该请求需要登录重定向到认证中心的?
    答:用户通过浏览器地址栏访问系统A,系统A(也可以称为CAS客户端)去Cookie中拿JSESSION,即在Cookie中维护的当前回话session的id,如果拿到了,说明用户已经登录,如果未拿到,说明用户未登录。

    2)、问:系统A重定向到认证中心,发送了什么信息或者地址变成了什么?
    答:假如系统A的地址为http://a:8080/,CAS认证中心的服务地址为http://cas.server:8080/,那么重点向前后地址变化为:http://a:8080/————>ttp://cas.server:8080/?service=http://a:8080/,由此可知,重点向到认证中心,认证中心拿到了当前访问客户端的地址。

    3)、问:登录成功后,认证中心重定向请求到系统A,认证通过令牌是如何附加发送给系统A的?
    答:重定向之后的地址栏变成:http://a:8080/?ticket=ST-XXXX-XXX,将票据以ticket为参数名的方式通过地址栏发送给系统A

    4)、问:系统A验证令牌,怎样操作证明用户登录的?
    答:系统A通过地址栏获取ticket的参数值ST票据,然后从后台将ST发送给CAS server认证中心验证,验证ST有效后,CAS server返回当前用户登录的相关信息,系统A接收到返回的用户信息,并为该用户创建session会话,会话id由cookie维护,来证明其已登录。

    5)、问:登录B系统,认证中心是如何判断用户已经登录的?
    答:在系统A登录成功后,用户和认证中心之间建立起了全局会话,这个全局会话就是TGT(Ticket Granting Ticket),TGT位于CAS服务器端,TGT并没有放在Session中,也就是说,CAS全局会话的实现并没有直接使用Session机制,而是利用了Cookie自己实现的,这个Cookie叫做TGC(Ticket Granting Cookie),它存放了TGT的id,保存在用户浏览器上。
    相关内容分析可以查看:《SSO CAS单点系列》之 实操!轻松玩转SSO CAS就这么简单(相识篇)

    用户发送登录系统B的请求,首先会去Cookie中拿JSESSION,因为系统B并未登录过,session会话还未创建,JSESSION的值是拿不到的,然后将请求重定向到CAS认证中心,CAS认证中心先去用户浏览器中拿TGC的值,也就是全局会话id,如果存在则代表用户在认证中心已经登录,附带上认证令牌重定向到系统B。

    上面登录状态判断也是这个逻辑。

    6)、问:登出的过程,各个系统对当前用户都做了什么?
    答:认证中心清除当前用户的全局会话TGT,同时清掉cookie中TGT的id:TGC;
    然后是各个客户端系统,比如系统A、系统B,清除局部会话session,同时清掉cookie中session会话id:jsession

    2、对系统A登录流程图添加注释,查看

    这里写图片描述

    cas系列介绍文章分享:CAS介绍资源页面

    展开全文
  • CAS整合LDAP实现单点登录原理及部署学习笔记,cas实现单点登录,ldap负责账户管理
  • 单点登录CAS原理实现

    万次阅读 多人点赞 2017-11-14 21:46:44
    1.开源单点登录系统CAS入门1.1 什么是单点登录单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的...

    1.开源单点登录系统CAS入门

    1.1 什么是单点登录

    单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    我们目前的系统存在诸多子系统,而这些子系统是分别部署在不同的服务器中,那么使用传统方式的session是无法解决的,我们需要使用相关的单点登录技术来解决。

    这里写图片描述

    1.2 什么是CAS

    CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点:
    【1】开源的企业级单点登录解决方案。
    【2】CAS Server 为需要独立部署的 Web 应用。
    【3】CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。
    从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。下图是 CAS 最基本的协议过程:

    这里写图片描述

    SSO单点登录访问流程主要有以下步骤:

        1. 访问服务:SSO客户端发送请求访问应用系统提供的服务资源。
    
        2. 定向认证:SSO客户端会重定向用户请求到SSO服务器。
    
        3. 用户认证:用户身份认证。
    
        4. 发放票据:SSO服务器会产生一个随机的Service Ticket。
    
        5. 验证票据:SSO服务器验证票据Service Ticket的合法性,验证通过后,允许客户端访问服务。
    
        6. 传输用户信息:SSO服务器验证票据通过后,传输用户认证结果信息给客户端。
    

    1.3 CAS服务端部署

    Cas服务端其实就是一个war包。
    在资源\cas\source\cas-server-4.0.0-release\cas-server-4.0.0\modules目录下
    cas-server-webapp-4.0.0.war  将其改名为cas.war放入tomcat目录下的webapps下。启动tomcat自动解压war包。浏览器输入http://localhost:8080/cas/login  ,可看到登录页面
    

    这里写图片描述

    不要嫌弃这个页面丑,我们后期可以再提升它的颜值。暂时把注意力放在功能实现上。
    这里有个固定的用户名和密码   casuser /Mellon
    登录成功后会跳到登录成功的提示页面
    

    这里写图片描述

    1.4 CAS服务端配置

    1.4.1端口修改

    如果我们不希望用8080端口访问CAS, 可以修改端口
    (1)修改TOMCAT的端口
    打开tomcat 目录 conf\server.xml  找到下面的配置
    

    这里写图片描述

    将端口8080,改为9100
    (2)修改CAS配置文件
        修改cas的WEB-INF/cas.properties 
    

    server.name=http://localhost:9100

    1.4.2去除https认证

    CAS默认使用的是HTTPS协议,如果对安全要求不高,可使用HTTP协议。我们这里讲解通过修改配置,让CAS使用HTTP协议。
    (1)修改cas的WEB-INF/deployerConfigContext.xml
    找到下面的配置

    <bean class="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"
    p:httpClient-ref="httpClient"/>

    这里需要增加参数p:requireSecure=”false”,requireSecure属性意思为是否需要安全验证,即HTTPS,false为不采用
    (2)修改cas的/WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml
    找到下面配置

    <bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
          p:cookieSecure="true"
          p:cookieMaxAge="-1"
          p:cookieName="CASTGC"
          p:cookiePath="/cas" />

    参数p:cookieSecure=”true”,同理为HTTPS验证相关,TRUE为采用HTTPS验证,FALSE为不采用https验证。
    参数p:cookieMaxAge=”-1”,是COOKIE的最大生命周期,-1为无生命周期,即只在当前打开的窗口有效,关闭或重新打开其它窗口,仍会要求验证。可以根据需要修改为大于0的数字,比如3600等,意思是在3600秒内,打开任意窗口,都不需要验证。
    我们这里将cookieSecure改为false , cookieMaxAge 改为3600
    (3)修改cas的WEB-INF/spring-configuration/warnCookieGenerator.xml
    找到下面配置

    <bean id="warnCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
    p:cookieSecure="true"
    p:cookieMaxAge="-1"
    p:cookieName="CASPRIVACY"
    p:cookiePath="/cas" />

    我们这里将cookieSecure改为false , cookieMaxAge 改为3600

    1.5 CAS客户端入门小Demo

    1.5.1客户端工程1搭建

    (1)搭建工程引入依赖
    创建Maven工程 (war)casclient_demo1 引入cas客户端依赖并制定tomcat运行端口为9001

    <dependencies>
            <!-- cas -->  
            <dependency>  
                <groupId>org.jasig.cas.client</groupId>  
                <artifactId>cas-client-core</artifactId>  
                <version>3.3.3</version>  
            </dependency>       
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
                <version>2.5</version>  
                <scope>provided</scope>
            </dependency>
        </dependencies>  
      <build>  
          <plugins>
              <plugin>  
                  <groupId>org.apache.maven.plugins</groupId>  
                  <artifactId>maven-compiler-plugin</artifactId>  
                  <version>2.3.2</version>  
                  <configuration>  
                      <source>1.7</source>  
                      <target>1.7</target>  
                  </configuration>  
              </plugin>  
              <plugin>
                    <groupId>org.apache.tomcat.maven</groupId>
                    <artifactId>tomcat7-maven-plugin</artifactId>
                    <configuration>
                        <!-- 指定端口 -->
                        <port>9001</port>
                        <!-- 请求路径 -->
                        <path>/</path>
                    </configuration>
              </plugin>
          </plugins>  
        </build>

    (2)添加web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://java.sun.com/xml/ns/javaee"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
        version="2.5">  
        <!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置 -->  
        <listener>  
         <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>  
        </listener>  
        <!-- 该过滤器用于实现单点登出功能,可选配置。 -->  
        <filter>  
            <filter-name>CAS Single Sign Out Filter</filter-name>  
           <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>  
        </filter>  
        <filter-mapping>  
            <filter-name>CAS Single Sign Out Filter</filter-name>  
            <url-pattern>/*</url-pattern>  
        </filter-mapping>  
        <!-- 该过滤器负责用户的认证工作,必须启用它 -->  
        <filter>  
            <filter-name>CASFilter</filter-name>       <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>  
            <init-param>  
                <param-name>casServerLoginUrl</param-name>  
                <param-value>http://localhost:9100/cas/login</param-value>  
                <!--这里的server是服务端的IP -->  
            </init-param>  
            <init-param>  
                <param-name>serverName</param-name>  
                <param-value>http://localhost:9001</param-value>
            </init-param>  
        </filter>  
        <filter-mapping>  
            <filter-name>CASFilter</filter-name>  
            <url-pattern>/*</url-pattern>  
        </filter-mapping>  
        <!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->  
        <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>http://localhost:9100/cas</param-value>  
            </init-param>  
            <init-param>  
                <param-name>serverName</param-name>  
                <param-value>http://localhost:9001</param-value>
            </init-param>  
        </filter>  
        <filter-mapping>  
            <filter-name>CAS Validation Filter</filter-name>  
            <url-pattern>/*</url-pattern>  
        </filter-mapping>  
        <!-- 该过滤器负责实现HttpServletRequest请求的包裹, 比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。 -->  
        <filter>  
            <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>  
            <filter-class>  
                org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>  
        </filter>  
        <filter-mapping>  
            <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>  
            <url-pattern>/*</url-pattern>  
        </filter-mapping>  
        <!-- 该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。 比如AssertionHolder.getAssertion().getPrincipal().getName()。 -->  
        <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 Assertion Thread Local Filter</filter-name>  
            <url-pattern>/*</url-pattern>  
        </filter-mapping>  
    </web-app>

    (3)编写index.jsp

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>一品优购</title>
    </head>
        <body>
            欢迎来到一品优购
            <%=request.getRemoteUser()%>
        </body>
    </html>

    request.getRemoteUser()为获取远程登录名

    1.5.2客户端工程2搭建

    (1)创建Maven工程 (war)casclient_demo2  引入cas客户端依赖并制定tomcat运行端口为9002
    
    (2)创建web.xml,参照casclient_demo1  ,将serverName的值改为http://localhost:9002,一共两处
    
    (3)创建index.jsp  ,内容显示“欢迎来到二品优购”
    

    1.5.3单点登录测试

    (1)启动cas部署的tomcat  
    
    (2)启动客户端工程1和客户端工程2
    
    (3)地址栏输入http://localhost:9001/   和http://localhost:9002/  ,地址均会跳转到CAS登录页
    
    (4)输入用户名和密码后,页面跳转回9002  ,再次访问9001也可以打开主页面。
    

    1.5.4单点退出登录

    地址栏输入  http://localhost:9100/cas/logout 
    

    即可看到退出后的提示页面
    这里写图片描述

    我们可以将这个链接添加到index.jsp中

    <a href="http://localhost:9100/cas/logout">退出登录</a>

    但我们更希望退出登录后,能自动跳转到某个页面,那如何处理呢?
    修改cas系统的配置文件cas-servlet.xml

     <bean id="logoutAction" class="org.jasig.cas.web.flow.LogoutAction"
            p:servicesManager-ref="servicesManager"
            p:followServiceRedirects="${cas.logout.followServiceRedirects:true}"/>

    改为true后,可以在退出时跳转页面到目标页面,修改index.jsp的退出链接

    <a href="http://localhost:9100/cas/logout?service=http://www.baidu.com">退出登录</a>

    2.CAS服务端数据源设置

    2.1需求分析

    我们现在让用户名密码从我们的品优购的user表里做验证

    2.2配置数据源

    (1)修改cas服务端中web-inf下deployerConfigContext.xml ,添加如下配置
    
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"  
                  p:driverClass="com.mysql.jdbc.Driver"  
                  p:jdbcUrl="jdbc:mysql://127.0.0.1:3306/pinyougoudb?characterEncoding=utf8"  
                  p:user="root"  
                  p:password="123456" /> 
    <bean id="passwordEncoder" 
    class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder"  
            c:encodingAlgorithm="MD5"  
            p:characterEncoding="UTF-8" />  
    <bean id="dbAuthHandler"  
              class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"  
              p:dataSource-ref="dataSource"  
              p:sql="select password from tb_user where username = ?"  
              p:passwordEncoder-ref="passwordEncoder"/>  

    然后在配置文件开始部分找到如下配置

    <bean id="authenticationManager" class="org.jasig.cas.authentication.PolicyBasedAuthenticationManager">
            <constructor-arg>
                <map>               
                    <entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
                    <entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />
                </map>
            </constructor-arg>      
            <property name="authenticationPolicy">
                <bean class="org.jasig.cas.authentication.AnyAuthenticationPolicy" />
            </property>
    </bean>

    其中

     <entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />

    一句是使用固定的用户名和密码,我们在下面可以看到这两个bean ,如果我们使用数据库认证用户名和密码,需要将这句注释掉。
    添加下面这一句配置

    <entry key-ref="dbAuthHandler" value-ref="primaryPrincipalResolver"/>
    (2)将以下三个jar包放入webapps\cas\WEB-INF\lib下  
    

    这里写图片描述

    用数据库中的用户名和密码进行测试
    

    3.CAS服务端界面改造

    3.1需求分析

    我们现在动手将CAS默认的登录页更改为自己的品优购登陆页

    3.2改头换面

    3.2.1拷贝资源

    (1)将品优购的登陆页login.html拷贝到cas系统下WEB-INF\view\jsp\default\ui 目录下
    
    (2)将css  js等文件夹拷贝到  cas目录下
    
    (3) 将原来的casLoginView.jsp 改名(可以为之后的修改操作做参照),将login.html改名为casLoginView.jsp 
    

    3.2.2修改页面

    编辑casLoginView.jsp 内容

    (1)添加指令

    <%@ page pageEncoding="UTF-8" %>
    <%@ page contentType="text/html; charset=UTF-8" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
    <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
    <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

    (2)修改form标签

    <form:form method="post" id="fm1" commandName="${commandName}" htmlEscape="true" class="sui-form">
    ......
    </form:form>

    (3)修改用户名框

    <form:input id="username" tabindex="1" 
        accesskey="${userNameAccessKey}" path="username" autocomplete="off" htmlEscape="true" 
        placeholder="邮箱/用户名/手机号" class="span2 input-xfat" />

    (4)修改密码框

     <form:password  id="password" tabindex="2" path="password" 
          accesskey="${passwordAccessKey}" htmlEscape="true" autocomplete="off" 
          placeholder="请输入密码" class="span2 input-xfat"   />

    (5)修改登陆按钮

    <input type="hidden" name="lt" value="${loginTicket}" />
    <input type="hidden" name="execution" value="${flowExecutionKey}" />
    <input type="hidden" name="_eventId" value="submit" />
    <input class="sui-btn btn-block btn-xlarge btn-danger" accesskey="l" value="登陆" type="submit" />

    修改后效果如下:
    这里写图片描述

    3.3错误提示

    在表单内加入错误提示框

    <form:errors path="*" id="msg" cssClass="errors" element="div" htmlEscape="false" />

    测试:输入错误的用户名和密码,提示是英文。这个提示信息是在WEB-INF\classes目录下的messages.properties文件中

    authenticationFailure.AccountNotFoundException=Invalid credentials.
    authenticationFailure.FailedLoginException=Invalid credentials.

    设置国际化为zn_CN ,修改cas-servlet.xml

    <bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" p:defaultLocale="zh_CN" />

    我们需要将此信息拷贝到messages_zh_CN.properties下,并改为中文提示(转码)

    authenticationFailure.AccountNotFoundException=\u7528\u6237\u4E0D\u5B58\u5728.
    authenticationFailure.FailedLoginException=\u5BC6\u7801\u9519\u8BEF.

    第一个是用户名不存在时的错误提示
    第二个是密码错误的提示

    展开全文
  • CAS实现单点登录原理与实例解析

    千次阅读 2016-04-19 11:24:50
    上几篇博客介绍了使用cookie实现同域和跨域系统的单点登录,本文将介绍通过CAS实现单点登录实例。 CAS是由耶鲁大学研发的单点登录服务器,主要分为服务端和客户端两个系统模块;本文将通过官网提供的实例进行介绍。 ...

        上几篇博客介绍了使用cookie实现同域和跨域系统的单点登录,本文将介绍通过CAS实现单点登录实例。

    CAS耶鲁大学研发的单点登录服务器主要分为服务端和客户端两个系统模块;本文将通过官网提供的实例进行介绍。

    一、CAS实现SSO的原理与认证流程

    使用CAS实现SSO的原理实际跟生成cookie进行认证一样,不过CAS将这个认证cookie称之为Ticket。

    认证流程如下:

    1、浏览器发出用户请求到客户端程序(例如上文中的www.a.com,www.b.com属于两个客户端程序)。 

    2、客户端验证客户端会在本地验证是否有该请求对应的Ticket信息,如果没有,表示该用户尚未登陆,重定向到CAS服务器,服务器负责生成一个用户Ticket,返回给客户端。

    3、 客户端再将浏览器发来的用户请求与服务器返回的Ticket验证,有效则返回客户端指定页面。客户端将该Ticket保存,以备下一个用户请求进行验证。

    CAS客户端的Ticket实际就是CAS服务端返回的凭证cookie。

     二、CAS实现单点登录

    1、建立三个域名指向本地IP

        两个客户端:127.0.0.1  www.a.com 、127.0.0.1  www.b.com

         一个服务端:127.0.0.1  www.server.com

    2、下载CAS相关jar包

       CAS-server3.xx.zip    CAS-client.zip

    3、CAS服务端配置

        解压CAS-server.zip,并从中找到服务器端war文件,发布到应用服务器tomcat中,并配置tomcat server.xml文件添加<Host name=“www.server.com” appBase=server>;启动tomcat,输入 http://www.server.com ,CAS界面正常显示。

    4、CAS客户端配置

        1)直接下载官网提供的实例,将webapp解压到tomcat/bbs/ROOT目录下和tomcat/news/ROOT目录作为两个客户端程序。

             【CAS客户端依赖于CAS-client-core和commons-logging两个jar,位于在client压缩包的module文件夹中】

        2)修改客户端web.xml中filter的地址,启动tomcat后,客户端即可正常运行。

    三、CAS源码思路

    通过配置我们不难发现,CAS的实现思路与上一篇博文实现SSO的思路基本一致:

    1. 服务端代码负责生成Ticket并用一个map结构维护这些Ticket。也就是SSO体系结构中的“认证中心”。同时也负责与数据库的交互。

    2. 客户端编写验证代码,主要负责认证和核对Ticket,也就是web.xml中两个核心拦截器用于拦截客户端请求。分别用于重定向和接收服务器发送的Ticket。

    3. CAS的服务器端程序由spring+Spring web flow写成。全部使用spring配置文件。

    四、CAS同类产品

    单点登录的具体实现有很多种选择,包括:

    1、采用专门的SSO商业软件: 主要有:Netgrity的Siteminder,已经被CA收购。Novell 公司的iChain。RSA公司的ClearTrust等。

    2、采用门户产品供应商自己的SSO产品,如:BEA的WLES,IBM 的Tivoli Access Manager,Sun 公司的identity Server,Oracle公司的OID等。

    3、这些商业软件一般适用于客户对SSO的需求很高,并且企业内部采用COTS软件如:Domino,SAP,Sieble的系统比较多的情况下采用。并结合身份管理。统一认证等项目采用。采用这些软件一般都要对要集成的系统做些改造,如在要集成的系统上安装AGENT。现在一般只提供常见软件如:Domino,SAP,Sieble,常见应用服务器:weblogic,websphere等的AGENT。要先统一这些系统的认证。一般采用LDAP或数据库。然后才能实现SSO。比较麻烦。

    4、开源类产品主要有:

    JOSSO:http://www.josso.org/

    OPENSSO: https://opensso.dev.java.net/

     

     

    展开全文
  • CAS 单点登录实现原理(一)

    千次阅读 2018-06-01 11:20:43
    因此引入CAS服务端作为用户信息鉴别和传递中介,达到单点登录的效果。 二,CAS流程图 官方流程图,地址: https://apereo.github.io/cas/ ... 浏览器与APP01服务端 浏览器第一次访问受保护的APP01服务端,由于未经...
  • 前后端分离模式下 CAS 单点登录实现方案前言知识点前后端分离单点登录CAS用户登录登录用户访问其他资源CAS ServerCAS ClientTicket Grangting Ticket(TGT)Ticket-granting cookie(TGC)Service ticket(ST)...
  • SpringBoot 简单实现仿CAS单点登录系统

    千次阅读 2019-05-28 17:59:03
    SpringBoot 简单实现仿CAS单点登录系统参考开源项目介绍实现原理大致如下:单点登录Demo单点登录Demo介绍单点登录单点授权验证单点退出 参考开源项目介绍 最近看了一下杰哥开源的项目 ...
  • 转载地址 http://www.cnblogs.com/lihuidu/p/6495247.html1、基于Cookie的单点登录的回顾 基于Cookie的单点登录核心原理: 将用户名密码加密之后存于Cookie中,之后访问网站时在过滤器(filter)中校验用户权限,...
  • Cas单点登录原理分析

    2021-01-03 22:39:52
    目录同花顺单点登录举例单点登录组成Cas原理分析单点登录技术选型CASJWTCas实现步骤 同花顺 一个企业,有很多个软件。 有一天,领导心血来潮,闲的发慌,想要检查一下公司内部的各个系统的操作记录,看看有没有人吃...
  • 1.什么是单点登录特别注意 本文讲的是CAS单点登录CAS4.0.0版本,CAS默认认证方式使用的事HTTPS协议,一般对安全性不高的话建议取消改成HTTP方式,因为开启的话会经常提示证书过去,需要用户确认等,对客户感知不好...
  • CAS单点登录原理分析(一)

    万次阅读 多人点赞 2018-11-13 21:43:02
    一,业务分析 在分布式系统架构中,假设把上述的三个子系统部署在三个不同的服务器上。前提是用户登录之后才能访问这些子系统。那么使用传统方式,可能会...而使用单点登录就可以很好地解决上述的问题。 二,单...
  • php cas单点登录

    千次阅读 2016-07-14 22:59:06
    一、CAS简介 1、结构体系 从结构体系看, CAS 包括两部分: CAS Server 和 CAS Client 。 1.1、 CAS Server CAS Server 负责完成对用户的认证工作 , 需要独立部署 , CAS Server 会处理用户名 / 密码等凭证...
  • CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的、开源的项目,旨在为 Web 应用系统提供一种可靠的单点登录解决方法(属于 Web SSO )。 CAS 开始于 2001 年, 并在 2004 年 12 月正式...
  • CAS单点登录实现(二)

    万次阅读 多人点赞 2018-11-16 16:15:53
    这篇文章对CAS单点登录具体实现的一些步骤就行讲述,至于CAS单点登录实现原理分析,请参看下面这篇文章: CAS单点登录原理分析 https://blog.csdn.net/qq_41258204/article/details/84036875 CAS 包含两个部分:...
  • cas跨域单点登录原理

    万次阅读 热门讨论 2017-04-17 21:12:43
    cas跨域单点登录原理
  • 基于CAS实现单点登录

    千次阅读 2019-04-01 11:09:28
    最初由耶鲁大学的Shawn Bayern 开发,后由Jasig社区维护,经过十多年发展,目前已成为影响最大、广泛使用的、基于Java实现的、开源SSO解决方案。 2012年,Jasig和另一个有影响的组织Sakai Foundation合并,组成...
  • CAS单点登录原理详解

    2018-10-02 23:45:14
    基于Cookie的单点登录核心原理:  将用户名密码加密之后存于Cookie中,之后访问网站时在过滤器(filter)中校验用户权限,如果没有权限则从Cookie中取出用户名密码进行登录,让用户从某种意义上觉得只登录了一次。...
  • CAS实现单点登录

    万次阅读 2019-05-06 16:13:46
    SSO单点登录 在多个相互信任的系统中,用户只需要登录一次就可以访问其他受信任的系统。 新浪微博与新浪博客是相互信任的应用系统。 *当用户首次访问新浪微博时,新浪微博识别到用户未登录,将请求重定向...
  • CAS实现SSO单点登录原理.pdf
  • CAS单点登录原理实现 标签(空格分隔): 单点登录 CAS SSO ###目录 概念介绍 搭建流程 原理分析 ###概念介绍 CAS介绍 Central Authentication Service(缩写CAS)是一种针对万维网的单点登录协议。它的目的...
  • CAS实现单点登录理解

    2018-05-10 16:29:10
    CAS 是 Yale 大学发起的一个企业级的、开源的项目,旨在为 Web 应用系统提供一种可靠的单点登录解决方法(属于 Web SSO ),CAS 开始于 2001 年, 并在 2004 年 12 月正式成为 JA-SIG 的一个项目。...
  • CAS单点登录原理解析(转载)

    千次阅读 2017-03-03 10:52:00
    基于Cookie的单点登录核心原理: 将用户名密码加密之后存于Cookie中,之后访问网站时在过滤器(filter)中校验用户权限,如果没有权限则从Cookie中取出用户名密码进行登录,让用户从某种意义上觉得只登录了一次。 ...
  • 文档描述了cas单点登录原理以及例子的搭建和实现,简明而要,是学习cas单点登录技术不可多得的材料哦
  • CASCAS协议原理应用场景传统方式及弊端CAS协议原理概念解释组成部分CAS基本流程CAS协议的具体流程及细节建立单点登录,首次访问豆瓣第二次访问豆瓣读书首次访问豆瓣电影单点登出(SLO)代码实现(基于Flask) CAS...
  • SSO单点登录CAS实现

    2013-05-28 14:11:59
    该文档以CAS为列,详细讲述了sso登录原理及环境搭建过程,结合项目中的运用,对照文档,可以很清晰的搭建SSO单点登录环境
  • cas单点登录技术

    2013-06-07 10:57:13
    1 单点登录总体解决方案 2 CAS原理和协议 3 CAS安全性 4 CAS工作模式 5 系统设计方案 6 CAS关键技术 6.1 域名规范 6.2 中文用户登录提交时乱码 ...7 单点登录风险 ...9.3 TOMCAT中使用CAS实现单点登录LDAP方式

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,515
精华内容 10,206
关键字:

cas单点登录实现原理