环境介绍
- cas插件使用的是django_cas_ng 3.6.0
- pyhton 3.7.3
- django 2.2.3
先看看 cas的工作流程
借用大哥的一张图
假设A、B系统对接了一个cas:
- 登录A系统
1. 当请求到了A系统的程序,首先经过的应该是cas_client,cas_client发现你的请求没有ticket,就重定向到cas的地址进行登录也就是输入用户和密码的页面(重定向会记录跳转前的地址)
2.登录完成后,cas_server为A办法TGC和TGT(第一步要的ticket),同时会缓存TGC到cookie里(server和path都是访问casserver的路径)
3.跳转回A服务,此时会带上ticket,cas_client拿着ticket去cas_server去验证,这个ticket是不是有效的,如果有效,就会在服务端产生一个session,然后在浏览器产生一个cookie(A系统的地址和路径)。 然后把对应的资源返回给浏览器,你就能享受A系统的服务了
4.再次访问A服务,此时会带上cookie,cas_client根据这个cookie就知道你已经登录了,然后就会返回A的资源
- 登录B系统
1.登录B时,不会使用A的cookie,所以就两手空空的到达了cas client,然后cas client会重定向到cas_server,而此时由于之前的TGC已经缓存到了浏览器,所以此时访问cas_server会带上TGC。 cas_server拿到tgc后,就知道已经登录了。
2.然后给B颁发一个TGT,然后重定向到B系统带上TGT,此时cas_client拿到这个tgt后,去cas那边验证一下。如果有效,就会在服务端产生一个session,然后在浏览器产生一个cookie(B系统的地址和路径)。然后把对应的资源返回给浏览器,你就能享受B系统的服务了
3.再次访问B服务,此时会带上cookie,cas_client根据这个cookie就知道你已经登录了,然后就会返回B的资源
如果你还是没有看明白,可以看一下大神的文章:
- https://www.cnblogs.com/codestory/p/5512104.html
- https://www.cnblogs.com/lihuidu/p/6495247.html
django_cas在这个过程中做了什么呢
- 第一次登录
1、backend是我们在setting文件中指定的,我们有可能会有很多,django会拿着入参和backend的函数比较,看看那个backend能使用这个入参
代码的位置:django\contrib\auth\__init__.py 的 authenticate函数
2、不出意外会调用到django_cas_ng的CASBackend,CASBackend会去cas server进行TGT验证,验证通过后会在auth_user表中创建一条记录
代码的位置:site-packages\django_cas\backends.py 的CASBackend
auth_user表
- 继续
1、首次登陆时request.user,是被赋予了一个AnonymousUser,AnonymousUser的is_authenticated方法是返回false的。登陆后创建的user的is_authenticated是返回true的
2、django_cas_ng_sessionticket表是在登出的时候使用的,根据sessionid(cookie)获取TGT,然后带着TGT去cas server去做登出操作
3、当再次登录的时候,django的session Middleware会根据cookie中的sessionid创建一个user用户,并赋值给request.user。所以我们在使用request.user.is_authenticated()的时候,就会返回True,也就登录成功了
如果对本文有疑问或者发现不对的地方,希望能给予评论或者进群630300475,讨论一下。