当前位置:首页 > 编程教程 > Python技术文章 > Django集成CAS单点登录的方法示例

Django集成CAS单点登录的代码分析

  • 发布时间:
  • 作者:码农之家
  • 点击:128

这篇文章主要知识点是关于Django、CAS、的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

精通Django
精通Django高清版
  • 类型:Django大小:7.5 MB格式:PDF作者:Nigel George
立即下载

Django集成CAS单点登录的方法示例

CAS 全称集中式认证服务(Central Authentication Service),是实现单点登录(SSO)的一中手段。

CAS 的通讯流程图如下(图片来自Google图库):

 

 
Django集成CAS单点登录的方法示例

 

对于本文用户可感知的层面,认证过程如下:

  1. 前端访问后端登录接口
  2. 后端返回重定向到 CAS 服务器的登录页面,并携带当前用户访问的网页链接
  3. 用户登录,浏览器发送请求到 CAS 服务器进行认证
  4. CAS 认证通过,将本次登录保存到会话,返回回调地址给后端
  5. 后端返回重定向请求给前端
  6. 前端重定向到跳转登录前的页面

中间涉及到的 TGT 处理逻辑已经由开源 CAS Client(python-cas) 实现。

要注意,CAS 服务器本身有一些过滤条件,例如域名白名单等,因此接入的时候需要将新系统的域名或 IP 加入 CAS 服务端配置中。

出于安全考虑,CAS 一般不支持跨域,因此前后端分离开发时可能比较麻烦。(似乎有解决方案,但是未尝试过)

接入 CAS

因为是第一次接触 CAS ,为了方便调试,我在本地直接启动一个 CAS 服务端用于调试。

CAS 客户端也就是集成于我们实际开发的Django代码中。

CAS 服务端

GitHub 中有很多 CAS 项目,我选了一个基于 Django 的 django-mama-cas 应用。

配置

创建 django-cas-server 项目:

django-admin startproject django-cas-server

安装 django-mama-cas 依赖:

pip install django-mama-cas

INSTALLED_APPS 中添加 'mama_cas' 应用:

settings.py

INSTALLED_APPS = [
  ...
  'mama_cas',
]

添加 mama_cas 应用中的路由:

urls.py

urlpatterns += [url(r'', include('mama_cas.urls'))]

配置 CAS 信息:

MAMA_CAS_SERVICES = [
  {
    # 必填项,此项为**Client** IP:Port,相当于白名单
    'SERVICE': 'http://127.0.0.1:8000',
    # 回调模式,具体参考官方文档
    'CALLBACKS': [
      'mama_cas.callbacks.user_model_attributes',
    ],
  },
]

使用

# 使用任意端口都可,此处我使用 30000
python manage.py runserver 0.0.0.0:30000

服务启动后,可以访问 http://0.0.0.0:30000/login 到达 CAS 登录页面。

问题来了,用户名密码是什么呢?

我着实花了点时间才解决这个问题———— django-mama-cas 默认使用的是 django.auth 模块 User ,使用 django-admin 创建超级用户,该用户也就可以用于登录 CAS :

python manage.py createsuperuser

输入用户密码即完成超级用户创建,接着使用这个用户登录即可。

CAS 客户端

Python 有开源的 CAS 客户端 python-cas ,由于我使用的 Django 开发后端,因此直接选用封装好 python-cas 的 Django 应用 django-cas-ng

配置

同样需要先安装依赖:

pip install django-cas-ng

settings.py 中的 INSTALLED_APPSAUTHENTICATION_BACKENDS 两处添加 django-cas-ng 的配置:

settings.py

INSTALLED_APPS = (
  # ... other installed apps
  'django_cas_ng',
)

AUTHENTICATION_BACKENDS = (
  'django.contrib.auth.backends.ModelBackend',
  'django_cas_ng.backends.CASBackend',
)

同时参考准备接入的 CAS 地址和版本,添加几个对应的配置:

# CAS 的地址
CAS_SERVER_URL = 'http://127.0.0.1:30000'
# CAS 版本
CAS_VERSION = '3'
# 存入所有 CAS 服务端返回的 User 数据。
CAS_APPLY_ATTRIBUTES_TO_USER = True

添加登入登出的路由(这两部分逻辑已由 django-cas-ng 完成,可以直接使用。如果需要扩展,可以参照源码自己实现即可):

urls.py

import django_cas_ng.views as cas_views
urlpatterns = [
  ...
  path('login/', django_cas_ng.views.LoginView.as_view(), name='cas_ng_login'),
  path('logout/', django_cas_ng.views.LogoutView.as_view(), name='cas_ng_logout'),
]

调试

启动当前服务:

python manage.py runserver

访问 http://127.0.0.1:8000/login ,网页将会跳转到 http://127.0.0.1:30000/login?service=http://127.0.0.1:8000 CAS 登录页面(注意端口不同),登录成功后将会跳转回来。

总结

CAS 本身逻辑需要理解,但是毕竟是成熟的单点登录架构,一般都存在开源的客户端实现,代码量不多,多调试多参考文档配置即可。

参考

https://github.com/jbittel/django-mama-cas
https://django-mama-cas.readthedocs.io/en/latest/
https://github.com/mingchen/django-cas-ng

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

您可能感兴趣的文章:

  • Django配置celery执行异步任务和定时任务详解
  • Django前后台数据传递的实例方法
  • Django实现学生管理系统实例分享
  • Django中修改js css文件但浏览器无法及时与之改变的解决方法
  • 实例详解django中render()和render_to_response()的区别
  • Django集成CAS 相关电子书
    学习笔记
    网友NO.119633

    Django项目中实现使用qq第三方登录功能

    使用qq登录的前提是已经在qq互联官网创建网站应用并获取到QQ互联中网站应用的APP ID和APP KEY 1,建路由 # qq登录 path('loginQq/',qq.loginQq,name='loginQq/'), path('returns/',qq.returns,name='returns/'), 2,前端页面 写qq登录的链接,本文没有用图标,暂时使用a链接请求。 a data-wow-delay=".5s" href="/blog/loginQq/" rel="external nofollow" QQ登录/a 3,在项目的应用 下创建utils文件夹并创建function.py用于封装函数,封装的函数用于从返回数据中提取openid(腾讯公司数据库里面的用户id) 封装的函数内容如下; import redef parse_jsonp(jsonp_str): try: return re.search('^[^(]*?\((.*)\)[^)]*$', jsonp_str).group(1) except: raise ValueError('无效数据!') 4,后台代码 from django.shortcuts import render,redirect,HttpResponse,HttpResponseRedirectfrom blog.models import Memberfrom urllib import parsefrom urllib import request as reqimport reimport jsonimport randomfrom blog.uti……

    网友NO.525784

    Django实战之用户认证(用户登录与注销)

    上一篇中,我们已经打开了Django自带的用户认证模块,并配置了数据库连接,创建了相应的表,本篇我们将在Django自带的用户认证的基础上,实现自己个性化的用户登录和注销模块。 首先,我们自己定义一个用户登录表单(forms.py): from django import formsfrom django.contrib.auth.models import Userfrom bootstrap_toolkit.widgets import BootstrapDateInput, BootstrapTextInput, BootstrapUneditableInput class LoginForm(forms.Form): username = forms.CharField( required=True, label=u"用户名", error_messages={'required': '请输入用户名'}, widget=forms.TextInput( attrs={ 'placeholder':u"用户名", } ), ) password = forms.CharField( required=True, label=u"密码", error_messages={'required': u'请输入密码'}, widget=forms.PasswordInput( attrs={ 'placeholder':u"密码", } ), ) def clean(self): if not self.is_valid(): raise forms.ValidationError(u"用户名和密码为必填项") else: cleaned_data = super(LoginFor……

    网友NO.509870

    Django框架使用内置方法实现登录的代码示范

    本文实例讲述了Django框架使用内置方法实现登录功能。分享给大家供大家参考,具体如下: 一内置登录退出思维导图 二Django内置登录方法 1位置 2源码 @deprecate_current_app@sensitive_post_parameters()@csrf_protect@never_cache# 视图函数要渲染的模板位置(registration/login.html)def login(request, template_name=registration/login.html, redirect_field_name=REDIRECT_FIELD_NAME, authentication_form=AuthenticationForm, extra_context=None, redirect_authenticated_user=False): Displays the login form and handles the login action. redirect_to = request.POST.get(redirect_field_name, request.GET.get(redirect_field_name, )) if redirect_authenticated_user and request.user.is_authenticated: redirect_to = _get_login_redirect_url(request, redirect_to) if redirect_to == request.path: raise ValueError( Redirection loop for authenticated user detected. Check that your LOGIN_REDIRECT_URL doesnt point to a login page. ) return HttpResponseRedire……

    网友NO.682191

    Django框架实现的普通登录案例【使用POST方法】

    本文实例讲述了Django框架实现的普通登录。分享给大家供大家参考,具体如下: 1.显示登录页面 a.设计url,通过浏览器访问 http://127.0.0.1:8000//login 的时候现实登录页面 b.设计url对应的视图函数 c.编写模板文件login.html 2.登录校验功能 校验数据库中有没有这个用户,这里用模拟的伪校验 新建login.html 在templates文件夹下的booktest文件夹下新建 !DOCTYPE htmlhtml lang="en"head meta charset="UTF-8" titleTitle/title/headbodyPOST:提交的参数在请求头里,数据比较重要用postGET:提交的参数在url中用post方法提交到login_check页面中form method="post" action="/login_check" 用户名:input type="text" name="username" 密码:input type="password" name="password" input type="submit" value="登录"/form/body/html 注意这里表单的提交方法选择post方法,action配置如上 配置urls.py url(r'^login$',views.login),url(r'^login_check$',views.login_check), views……

    网友NO.841310

    Django 忘记管理员或忘记管理员密码 重设登录密码的方法

    看到标题就知道有逗比忘了密码。。。没错就是我。 你也忘了密码? 不要着急! 0x00: 第一步:运行django shell python3 manage.py shell 0x01: 第二步:重设密码 from django.contrib.auth.models import User user = User.object.get(username='your_account') user.set_password('your_new_password') user.save() quit() 0x02: 如果你连管理员用户名都忘了。。。 没事别慌。。 from django.contrib.auth.models import User user = User.objects.get(pk=1) userUser: you_account user.set_password('your_new_password') user.save() quit() 还是有办法的。。。 以上这篇Django 忘记管理员或忘记管理员密码 重设登录密码的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持码农之家。 ……

    <
    1
    >

    Copyright 2018-2020 www.xz577.com 码农之家

    版权投诉 / 书籍推广 / 赞助:520161757@qq.com