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

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

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

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

精通Django

本书的主要目的是把你打造成 Django 专家。本书集中讲解两方面的内容。首先,深入说明 Django 的机制,教你使用它构建 Web 应用。其次,适当讨论高级概念,说明如何在项目中有效使用相关的

查看详情

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

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

以上就是本次给大家分享的关于Python的全部知识点内容总结,大家还可以在下方相关文章里找到如何使用python代理工具m、 python模块库ansible的用法详、 实例详解django中render()和、 等python文章进一步学习,感谢大家的阅读和支持。

上一篇:如何由java转学python

下一篇:python ChainMap合并字典的操作方法

展开 +

收起 -

Django集成CAS 相关内容
Django配置celery执行异步任务和定时任务详解

这篇文章主要介绍了Django配置celery(非djcelery)执行异步任务和定时任务,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

查看详情
Django前后台数据传递的实例方法

本篇文章主要介绍了Django 前后台的数据传递的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

查看详情
Django实现学生管理系统实例分享

这篇文章主要为大家详细介绍了Django实现学生管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

查看详情
Django中修改js css文件但浏览器无法及时与之改变的解决方法

今天小编就为大家分享一篇解决Django中修改js css文件但浏览器无法及时与之改变的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

查看详情
实例详解django中render()和render_to_response()的区别

今天小编就为大家分享一篇对django中render()与render_to_response()的区别详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

查看详情
跟老齐学Python:Django实战

《跟老齐学Python:Django实战》是以Python为基础进行Web应用开发的进阶读物。适合已经具有Python基础技能、进行Web应用开发的读者。感兴趣的小伙伴们可以下载参考一下

查看详情
Python Django Web典型模块开发实战

腾讯云服务社区/阿里巴巴云栖社区栏目创作者Django全栈开发心得分享 详细说明DjangoWeb开发设计中11个常见典型性控制模块的开发设计全过程 协助你变成一位Django全栈开发的高手级程序猿 项目

查看详情
玩转Django 2.0

这书全部编程代码均在Python3.6Django2.0自然环境下产品测试,出示案例源代码下载。这书是1本PythonWeb的技术总结,关键以Python3和Django2.0版本号保持。根据这书的学习培训,用户可以深入把握Dj

查看详情
Python高效开发实战:Django、Tornado、Flask、Twisted

也许你听说过全栈工程师,他们善于设计系统架构,精通数据库建模、通用网络协议、后端并发处理、前端界面设计,在学术研究或工程项目上能独当一面。通过对Python及其周边Web框架的学习

查看详情
Python新手使用Django架站的16堂课

本书作者台湾大师带你活用Django Web Framework快速构建移动网站,以16堂课来介绍Python新手使用Django架站的要点,可作为Python Django的初学者的参考书籍

查看详情
Django开发宝典

本书是对Python Django开发全过程解析,使读者能够掌握项目的开发流程。由浅入深地带领读者进行Django的开发,最终使读者掌握项目的开发流程,从而运用于自己的项目开发中

查看详情
Django企业开发实战:高效Python Web框架指南

这书以从零开始开发设计1个博客系统为例,详细介绍Django在平时工作上的运用。这书共分成四一部分。*一部分详细介绍编号以前的提前准备工作中,包含需求分析报告、Web开发设计基本及其电

查看详情
Django集成CAS 学习笔记
网友NO.885449

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.702266

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.633590

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 doesn't point to a login page." ) return ……

网友NO.626884

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.955789

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 xz577.com 码农之家

本站所有电子书资源不再提供下载地址,只分享来路

免责声明:网站所有作品均由会员网上搜集共同更新,仅供读者预览及学习交流使用,下载后请24小时内删除

版权投诉 / 书籍推广 / 赞助:QQ:520161757