安全性:web
用户只须在cas录入用户名和密码,以后经过ticket绑定用户,在cas客户端与cas校验是经过ticket,并不会在网上传输密码,因此能够保证安全性,密码不被窃取数据库
原理:1个cookie+N个session浏览器
CAS建立cookie在全部应用中登陆时cas使用,各应用经过在IE建立各自的session来标识应用是否已经登陆。安全
Cookie:在cas为各应用登陆时使用,实现了只须一次录入用户密码服务器
Session:各应用会建立本身的session表示是否登陆cookie
1. CAS 登陆时处理:session
第一步:cas往浏览器增长cookie(TGC)app
CAS向浏览器送回一个所谓的“内存cookie”。这种cookie并非真的保存在内存中,而只是浏览器一关闭,cookie就自动过时。这个cookie称为“ticket-granting cookie”,用来代表用户已经成功地登陆。this
这个Cookie是一个加密的Cookie,其中保存了用户登陆的信息。用于之后其它应用客户端登陆。加密
第二步:cas同时建立一个ticket重定向到原来的cas客户端
认证成功后,CAS服务器建立一个很长的、随机生成的字符串,称为“Ticket”。随后,CAS将这个ticket和成功登陆的用户,以及服务联系在一块儿。这个ticket是一次性使用的一种凭证,它只对登陆成功的用户及其服务使用一次。使用过之后马上失效。
2. Cas 客户端应用A的处理
第一步:收到ticket后,向cas提交验证ticket
Cas客户端收到ticket以后,应用程序须要验证ticket。这是经过将ticket 传递给一个校验URL来实现的。校验URL也是CAS服务器提供的。CAS经过校验路径得到了ticket以后,经过内部的数据库对其进行判断。若是判断是有效性,则返回一个NetID给应用程序。随后CAS将ticket做废,而且在客户端留下一个cookie。(谁来建立cookie?),
第二步:ticket验证后建立session
之后登陆此应用时,没有ticket,但IE能提供session,从session中取得CASReceipt,并验证若是有效说明已经在此应用认证过,容许访问此应用,
到此为止,CAS会记录用户已在应用A已经登陆
3. 用户登陆到应用B是如何处理
用户进入应用B时,首先仍然会重定向到CAS服务器。不过此时CAS服务器再也不要求用户输 入用户名和密码,而是首先自动寻找Cookie,根据Cookie中保存的信息,进行登陆。而后,CAS一样给出新的ticket重定向应用B给cas验证(流程同应用A验证方式),若是验证成功则应用B建立session记录CASReceipt信息到session中,之后凭此session登陆应用B。
到此为止,CAS会记录用户已在应用A和应用B进行登陆,可是当用户在应用B退出cas登陆时,要通知应用A进行退出,如何通知应用A呢?
CAS server接受请求后,会检测用户的TCG Cookie,把对应的session清除,同时会找到全部经过该TGC sso登陆的应用服务器URL提交请求,全部的回调请求中,包含一个参数logoutRequest,内容格式以下:
全部收到请求的应用服务器application会解析这个参数,取得sessionId,根据这个Id取得session后,把session删除。
这样就实现单点登出的功能。
首先,要实现single sign out在 应用服务器application端的web.xml要加入如下配置
注:若是有配置CAS client Filter,则CAS Single Sign Out Filter 必需要放到CAS client Filter以前。
配置部分的目的是在CAS server回调全部的application进行单点登出操做的时候,须要这个filter来实现session清楚。
看了下面的浏览器cookie变化,会对cas有更深的理解
下载个httpwatch监控一下cookie的变化
1. 第一次访问http://localhost:8080/a,
CLIENT:没票据且SESSION中没有消息因此跳转至CAS
CAS:拿不到TGC故要求用户登陆
2. 认证成功后回跳
CAS:经过TGT生成ST发给客户端,客户端保存TGC,并重定向到http://localhost:8080/a
CLIENT:带有票据因此不跳转只是后台发给CAS验证票据(浏览器中没法看到这一过程)
3. 第一次访问http://localhost:8080/b
CLIENT:没票据且SESSION中没有消息因此跳转至CAS
CAS:从客户端取出TGC,若是TGC有效则给用户ST并后台验证ST,从而SSO。【若是失效重登陆或注销时,怎么通知其它系统更新SESSION信息呢??TicketGrantingTicketImpl类grantServiceTicket方法里this.services.put(id,service);可见CAS端已经记录了当前登陆的子系统】
4. 再次访问http://localhost:8080/a
CLIENT:没票据可是SESSION中有消息故不跳转也不用发CAS验证票据,容许用户访问