searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

CAS单点登录原理

2023-05-30 01:24:30
18
0
 

第一次访问http://localhost:8889/hello

标号1:用户访问http://localhost:8889/hello,经过他的第一个过滤器(cas提供,在web.xml中配置)AuthenticationFilter。
      过滤器全称:org.jasig.cas.client.authentication.AuthenticationFilter
      主要作用:判断是否登录,如果没有登录则重定向到认证中心。
标号2:http://localhost:8889/hello发现用户没有登录,则返回浏览器重定向地址。
 
 
 
 
从上图我们可以看到请求http://localhost:8889/hello ,之后浏览器返回状态码是302,然后让浏览器重定向到http://localhost:8080/cas/login并且通过get的方式添加参数service,该参数的目的是登录成功之后还会重定向回来,因此需要这个参数。
 
标号3:浏览器接收到重定向之后发起重定向,请求 http://localhost:8080/cas/login。
标号4:认证中心http://localhost:8080/cas/login接收到登录请求,返回登陆页面。
 
 
 
图就是标号3的请求,以及标号4的响应。请求的URL是标号2返回的URL。之后认证中心就展示登录的页面,等待用户输入用户名密码。
标号5:用户在http://localhost:8080/cas/login的login页面输入用户名密码,提交。(casuser/Mellon)
标号6:服务器接收到用户名密码,则验证是否有效,验证逻辑可以使用cas-server提供现成的,也可以自己实现。
 
 
上图就是标号5的请求,以及标号6的响应了。当http://localhost:8080/cas/login 即cas-server认证通过之后,会返回给浏览器302,重定向的地址就是Location中的地址。同时会在Cookie中设置一个CASTGC,该cookie是网站http://localhost:8080/cas/login的cookie,只有访问这个网站才会携带这个cookie过去。
      Cookie中的CASTGC:向cookie中添加该值的目的是当下次访问http://localhost:8080/cas/login时,浏览器将Cookie中的TGC携带到服务器,服务器根据这个TGC(TGC中装的是TGT的id),查找与之对应的TGT。从而判断用户是否登录过了,是否需要展示登录页面。TGT与TGC的关系就像SESSION与Cookie中SESSIONID的关系。
      TGT:Ticket Granted Ticket(俗称大令牌,或者说票根,他可以签发ST)
      TGC:Ticket Granted Cookie(cookie中的value),存在Cookie中,根据他可以找到TGT。
      ST:Service Ticket (小令牌),是TGT生成的,默认是用一次就生效了。就是Location后面的ticket。
标号7:浏览器从http://localhost:8080/cas/login哪里拿到ticket之后,就根据指示带上ticket重定向到http://localhost:8999/hello,请求的url就是上面返回的url。
标号8:http://localhost:8999/hello在过滤器中会取到ticket的值,然后通过http方式调用http://localhost:8080/cas验证该ticket是否是有效的。
标号9:http://localhost:8080/cas接收到ticket之后,验证,验证通过返回结果告诉http://localhost:8889/hello该ticket有效。
标号10:http://localhost:8889/hello接收到cas-server的返回,知道了用户合法,展示相关资源到用户浏览器上。
 
 

4.2、第二次访问http://localhost:8889/hello

上面已经访问过一次了,当第二次访问的时候发生了什么呢?
标号11:用户发起请求,访问http://localhost:8889/hello。会经过cas-client,也就是过滤器,因为第一次访问成功之后http://localhost:8889/hello中会在session中记录用户信息,因此这里直接就通过了,不用验证了。
标号12:用户通过权限验证,浏览器返回正常资源。
 

4.3、访问http://localhost:8880/hello

标号13:用户在http://localhost:8889/hello正常上网,突然想访问http://localhost:8880/hello,于是发起访问http://localhost:8880/hello的请求。
标号14:http://localhost:8880/hello接收到请求,发现第一次访问,于是给他一个重定向的地址,让他去找认证中心登录。
上图可以看到,用户请求http://localhost:8880/hello,然后返回给他一个网址,状态302重定向,service参数就是回来的地址。
 
标号15:浏览器根据14返回的地址,发起重定向,因为之前访问过一次了,因此这次会携带上次返回的Cookie:TGC到认证中心。
 
标号16:认证中心收到请求,发现TGC对应了一个TGT,于是用TGT签发一个ST,并且返回给浏览器,让他重定向到http://localhost:8880/hello
可以发现请求的时候是携带Cookie:CASTGC的,响应的就是一个地址加上TGT签发的ST也就是ticket。
 
标号17:浏览器根据16返回的网址发起重定向。
标号18:http://localhost:8880/hello获取ticket去认证中心验证是否有效。
标号19:认证成功,返回在http://localhost:8880/hello的session中设置登录状态,下次就直接登录。
 
标号20:认证成功之后就反正用想要访问的资源了。
1) 系统A是如何发现第一次请求需要登录重定向到认证中心的
答:用户通过浏览器地址栏访问系统A,系统A去拿Cookie中的JESSION,即在Cookie中维护的当前会话session的id,如果拿到了,说明用户已经登录,如果没有拿到说明用户没有登录。
 
2)、问:系统A重定向到认证中心,发送了什么信息或者地址变成了什么?
答:假如系统A的地址为http://localhost:8889/hello,CAS认证中心的服务地址为http://localhost:8080/cas/login,那么重点向前后地址变化为:http://localhost:8889/hello————>http://localhost:8080/cas/login?service=http://localhost:8889/hello,由此可知,重定向到认证中心,认证中心拿到了当前访问客户端的地址。
 
3)、问:登录成功后,认证中心重定向请求到系统A,认证通过令牌是如何附加发送给系统A的?
答:重定向之后的地址栏变成:http://locahost:8889/hello?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,保存在用户浏览器上。
用户发送登录系统B的请求,首先会去Cookie中拿JSESSION,因为系统B并未登录过,session会话还未创建,JSESSION的值是拿不到的,然后将请求重定向到CAS认证中心,CAS认证中心先去用户浏览器中拿TGC的值,也就是全局会话id,如果存在则代表用户在认证中心已经登录,附带上认证令牌重定向到系统B。
6)、问:登出的过程,各个系统对当前用户都做了什么?
答:认证中心清除当前用户的全局会话TGT,同时清掉cookie中TGT的id:TGC;
然后是各个客户端系统,比如系统A、系统B,清除局部会话session,同时清掉cookie中session会话id:jsession
 
 
 
0条评论
0 / 1000
朱****霞
2文章数
0粉丝数
朱****霞
2 文章 | 0 粉丝
朱****霞
2文章数
0粉丝数
朱****霞
2 文章 | 0 粉丝
原创

CAS单点登录原理

2023-05-30 01:24:30
18
0
 

第一次访问http://localhost:8889/hello

标号1:用户访问http://localhost:8889/hello,经过他的第一个过滤器(cas提供,在web.xml中配置)AuthenticationFilter。
      过滤器全称:org.jasig.cas.client.authentication.AuthenticationFilter
      主要作用:判断是否登录,如果没有登录则重定向到认证中心。
标号2:http://localhost:8889/hello发现用户没有登录,则返回浏览器重定向地址。
 
 
 
 
从上图我们可以看到请求http://localhost:8889/hello ,之后浏览器返回状态码是302,然后让浏览器重定向到http://localhost:8080/cas/login并且通过get的方式添加参数service,该参数的目的是登录成功之后还会重定向回来,因此需要这个参数。
 
标号3:浏览器接收到重定向之后发起重定向,请求 http://localhost:8080/cas/login。
标号4:认证中心http://localhost:8080/cas/login接收到登录请求,返回登陆页面。
 
 
 
图就是标号3的请求,以及标号4的响应。请求的URL是标号2返回的URL。之后认证中心就展示登录的页面,等待用户输入用户名密码。
标号5:用户在http://localhost:8080/cas/login的login页面输入用户名密码,提交。(casuser/Mellon)
标号6:服务器接收到用户名密码,则验证是否有效,验证逻辑可以使用cas-server提供现成的,也可以自己实现。
 
 
上图就是标号5的请求,以及标号6的响应了。当http://localhost:8080/cas/login 即cas-server认证通过之后,会返回给浏览器302,重定向的地址就是Location中的地址。同时会在Cookie中设置一个CASTGC,该cookie是网站http://localhost:8080/cas/login的cookie,只有访问这个网站才会携带这个cookie过去。
      Cookie中的CASTGC:向cookie中添加该值的目的是当下次访问http://localhost:8080/cas/login时,浏览器将Cookie中的TGC携带到服务器,服务器根据这个TGC(TGC中装的是TGT的id),查找与之对应的TGT。从而判断用户是否登录过了,是否需要展示登录页面。TGT与TGC的关系就像SESSION与Cookie中SESSIONID的关系。
      TGT:Ticket Granted Ticket(俗称大令牌,或者说票根,他可以签发ST)
      TGC:Ticket Granted Cookie(cookie中的value),存在Cookie中,根据他可以找到TGT。
      ST:Service Ticket (小令牌),是TGT生成的,默认是用一次就生效了。就是Location后面的ticket。
标号7:浏览器从http://localhost:8080/cas/login哪里拿到ticket之后,就根据指示带上ticket重定向到http://localhost:8999/hello,请求的url就是上面返回的url。
标号8:http://localhost:8999/hello在过滤器中会取到ticket的值,然后通过http方式调用http://localhost:8080/cas验证该ticket是否是有效的。
标号9:http://localhost:8080/cas接收到ticket之后,验证,验证通过返回结果告诉http://localhost:8889/hello该ticket有效。
标号10:http://localhost:8889/hello接收到cas-server的返回,知道了用户合法,展示相关资源到用户浏览器上。
 
 

4.2、第二次访问http://localhost:8889/hello

上面已经访问过一次了,当第二次访问的时候发生了什么呢?
标号11:用户发起请求,访问http://localhost:8889/hello。会经过cas-client,也就是过滤器,因为第一次访问成功之后http://localhost:8889/hello中会在session中记录用户信息,因此这里直接就通过了,不用验证了。
标号12:用户通过权限验证,浏览器返回正常资源。
 

4.3、访问http://localhost:8880/hello

标号13:用户在http://localhost:8889/hello正常上网,突然想访问http://localhost:8880/hello,于是发起访问http://localhost:8880/hello的请求。
标号14:http://localhost:8880/hello接收到请求,发现第一次访问,于是给他一个重定向的地址,让他去找认证中心登录。
上图可以看到,用户请求http://localhost:8880/hello,然后返回给他一个网址,状态302重定向,service参数就是回来的地址。
 
标号15:浏览器根据14返回的地址,发起重定向,因为之前访问过一次了,因此这次会携带上次返回的Cookie:TGC到认证中心。
 
标号16:认证中心收到请求,发现TGC对应了一个TGT,于是用TGT签发一个ST,并且返回给浏览器,让他重定向到http://localhost:8880/hello
可以发现请求的时候是携带Cookie:CASTGC的,响应的就是一个地址加上TGT签发的ST也就是ticket。
 
标号17:浏览器根据16返回的网址发起重定向。
标号18:http://localhost:8880/hello获取ticket去认证中心验证是否有效。
标号19:认证成功,返回在http://localhost:8880/hello的session中设置登录状态,下次就直接登录。
 
标号20:认证成功之后就反正用想要访问的资源了。
1) 系统A是如何发现第一次请求需要登录重定向到认证中心的
答:用户通过浏览器地址栏访问系统A,系统A去拿Cookie中的JESSION,即在Cookie中维护的当前会话session的id,如果拿到了,说明用户已经登录,如果没有拿到说明用户没有登录。
 
2)、问:系统A重定向到认证中心,发送了什么信息或者地址变成了什么?
答:假如系统A的地址为http://localhost:8889/hello,CAS认证中心的服务地址为http://localhost:8080/cas/login,那么重点向前后地址变化为:http://localhost:8889/hello————>http://localhost:8080/cas/login?service=http://localhost:8889/hello,由此可知,重定向到认证中心,认证中心拿到了当前访问客户端的地址。
 
3)、问:登录成功后,认证中心重定向请求到系统A,认证通过令牌是如何附加发送给系统A的?
答:重定向之后的地址栏变成:http://locahost:8889/hello?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,保存在用户浏览器上。
用户发送登录系统B的请求,首先会去Cookie中拿JSESSION,因为系统B并未登录过,session会话还未创建,JSESSION的值是拿不到的,然后将请求重定向到CAS认证中心,CAS认证中心先去用户浏览器中拿TGC的值,也就是全局会话id,如果存在则代表用户在认证中心已经登录,附带上认证令牌重定向到系统B。
6)、问:登出的过程,各个系统对当前用户都做了什么?
答:认证中心清除当前用户的全局会话TGT,同时清掉cookie中TGT的id:TGC;
然后是各个客户端系统,比如系统A、系统B,清除局部会话session,同时清掉cookie中session会话id:jsession
 
 
 
文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0