python django集成cas验证系统

yizhihongxing

下面是关于 Python Django 集成 CAS 验证系统的详细攻略:

什么是CAS?

CAS 即 Central Authentication Service,是由耶鲁大学发起的一个单点登录(SSO)协议。CAS 提供了一个认证中心,浏览器只需要认证一次,就可以在多个应用中共享认证信息,实现单点登录。

Django集成CAS步骤

安装

pip install django-mama-cas==2.3.0

配置

1. 添加相应的应用

settings.py 中添加相应的应用:

CAS_SERVER_URL = 'http://example.com/cas/'
CAS_VERSION = '3'
CAS_PROVIDE_URL_TO_LOGOUT = True
CAS_IGNORE_REFERER = True
CAS_STORE_USER_INFO = 'myapp.utils.custom_store_user'

其中,CAS_SERVER_URL 是 CAS 服务器地址,CAS_VERSION 是 CAS 版本,CAS_PROVIDE_URL_TO_LOGOUT 表示登录后跳转到 cas 注销页面。CAS_IGNORE_REFERER 表示 Django 不会去检查 Referer 是否相同。CAS_STORE_USER_INFO 表示用户信息存储的方式。

2. 配置URL

urls.py 中配置 URL:

from django.urls import path
from django.contrib.auth.views import LoginView, LogoutView
from mama_cas.views import LoginView as MamaCASLoginView, LogoutView as MamaCASLogoutView

urlpatterns = [
    path('accounts/login/', MamaCASLoginView.as_view(), name='cas_login'),
    path('accounts/logout/', MamaCASLogoutView.as_view(), name='cas_logout'),
    path('login/', LoginView.as_view(), name='login'),
    path('logout/', LogoutView.as_view(), name='logout'),
]

其中,accounts/login/accounts/logout/ 分别对应 cas 的登录地址和注销地址。

3. 配置中间件

settings.py 中添加中间件:

MIDDLEWARE = [
    ...
    'mama_cas.middleware.MAMACASMiddleware',
    ...
]

4. 自定义存储用户信息

utils.py 中添加自定义存储用户信息的方法:

from django.contrib.auth.models import User

def custom_store_user(user_info, attributes, created, user):
    """
    Store user.
    :param user_info: returned from verify ticket
    :param attributes: returned from verify ticket
    :param created: bool
    :param user: Django User instance or None
    :return: user or None
    """
    if not user:
        username = user_info['cas:user']
        fullname = attributes.get('fullname', '')
        first_name, last_name = fullname.strip().split()[:2] if fullname else ('', '')
        email = attributes.get('email', '')
        user, created = User.objects.get_or_create(username=username, defaults={
            'first_name': first_name, 'last_name': last_name, 'email': email
        })
    return user

示例说明

添加CAS认证后跳转至原网站

from django.urls import reverse
from django.shortcuts import redirect

class CASLoginView(MamaCASLoginView):
    def form_valid(self, form):
        response = super().form_valid(form)
        next_url = self.request.GET.get('next', '/')
        redirect_url = reverse('login') + '?next=' + next_url
        return redirect(redirect_url)

class CASLogoutView(MamaCASLogoutView):
    def get(self, request, *args, **kwargs):
        response = super().get(request, *args, **kwargs)
        next_url = request.GET.get('next', '/')
        redirect_url = reverse('logout') + '?next=' + next_url
        return redirect(redirect_url)

我们可以通过实现 CASLoginViewCASLogoutView 来实现 CAS 认证后跳转到原网站。

其中,CASLoginViewform_valid 方法中添加了一个 redirect 函数,通过拼接当前访问的 URL 中的 next 参数来实现跳转。

CASLogoutViewCASLoginView 实现类似。

结合Django Rest Framework使用

from django.http import HttpResponse, JsonResponse
from django.utils.decorators import method_decorator
from django.views import View
from django.views.decorators.csrf import csrf_exempt
from rest_framework.views import APIView
from rest_framework.authentication import SessionAuthentication, BasicAuthentication
from mama_cas.decorators import cas_mama_required

class ApiView(APIView):
    authentication_classes = (SessionAuthentication, BasicAuthentication)

    @method_decorator(cas_mama_required)
    def get(self, request, *args, **kwargs):
        return JsonResponse({'message': 'hello'})

class MyView(View):
    @method_decorator(csrf_exempt)
    @method_decorator(cas_mama_required)
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request, *args, **kwargs)

    def get(self, request, *args, **kwargs):
        return HttpResponse('get request')

    def post(self, request, *args, **kwargs):
        data = request.body.decode('utf-8')
        return JsonResponse({'message': 'post request', 'data': data})

在结合 Django Rest Framework 时,我们需要在 MAMA CAS 的装饰器前加上 method_decorator 才能正常使用。

在上面的示例代码中,我们实现了两个视图,一个常规的视图 MyView,一个使用 Django Rest Framework 的视图 ApiView

MyView 视图中,我们需要使用 csrf_exempt 装饰器来使得 Django 不会检查 CSRF。

ApiView 视图中,我们需要使用 SessionAuthenticationBasicAuthentication 这两个认证类,且需要使用 cas_mama_required 装饰器来实现 CAS 认证。

结语

以上便是关于 Python Django 集成 CAS 验证系统的完整攻略,希望能帮助到您。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python django集成cas验证系统 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • mac使用python识别图形验证码功能

    针对mac使用python识别图形验证码功能,以下是完整攻略: 一、安装相关依赖 首先需要安装Python解释器,具体可以在官网上下载对应版本并安装。接着安装以下依赖库: Pillow Pillow是一个Python图像处理库,可以用来读取、处理和显示各种格式的图像文件。 可以通过pip安装Pillow: pip install Pillow tessera…

    人工智能概览 2023年5月25日
    00
  • Linux系统设置复杂密码策略方法

    下面我将为您详细讲解在Linux系统中如何设置复杂密码策略。 确认密码策略配置文件 首先,我们需要确认系统使用的密码策略配置文件。在大多数Linux系统中,默认使用的策略配置文件是/etc/login.defs,我们可以通过命令grep PASS_MAX_DAYS /etc/login.defs来确认该文件是否被使用。如果显示结果如下: PASS_MAX_D…

    人工智能概论 2023年5月25日
    00
  • 如何利用python web框架做文件流下载的实现示例

    下面是关于如何利用Python Web框架实现文件流下载的攻略。 什么是文件流下载? 文件流下载是指将文件以流的形式传输到客户端,并让客户端直接在浏览器中打开或下载文件,而不是将文件保存在服务端。 Python Web框架实现文件流下载 在Python Web框架中,常用的实现文件流下载的方法是使用HTTP Response对象中提供的StreamingHt…

    人工智能概论 2023年5月25日
    00
  • Django用户认证系统 组与权限解析

    完整攻略:Django用户认证系统组与权限解析 概述 Django用户认证系统是Django框架内置的一套用户身份验证系统,其通过提供表单、视图、验证、注册、登录、注销等一系列方法来协助开发者完成用户认证任务。 Django的用户认证系统内置了许多组件,其中包括用户组和权限两大部分,可以通过配置来自定义用户组的用户权限、登录限制和授权规则,以实现更为灵活和高…

    人工智能概览 2023年5月25日
    00
  • python用opencv将标注提取画框到对应的图像中

    以下是详细讲解”Python用OpenCV将标注提取画框到对应的图像中”的完整攻略。 准备工作 在开始前,需要安装以下库: opencv-python matplotlib 安装方法:在命令行中输入 pip install 库名。比如pip install opencv-python安装opencv-python库。 步骤一:读取图像和标注文件 首先,我们需…

    人工智能概论 2023年5月25日
    00
  • Windows server 2016服务器基本设置

    下面是“Windows Server 2016 服务器基本设置”的完整攻略。 1. Windows Server 2016 安装设置 1.1 下载 Windows Server 2016 镜像文件,刻录成光盘或 USB 启动盘。 1.2 将光盘或 USB 启动盘插入需要安装 Windows Server 2016 的服务器电脑上。 1.3 按下电脑开机键,选…

    人工智能概览 2023年5月25日
    00
  • python3转换code128条形码的方法

    下面是详细讲解“python3转换code128条形码的方法”的完整攻略。 什么是Code128条形码 Code 128是一种高密度的线性条码标准,可表示任何长度的数字或字母字符集。它通常用于商业和运输行业,以及在医疗、邮政和其他行业中广泛使用。 Python3中生成Code128条形码的方法 Python3中可以使用第三方库来生成Code128条形码。下面…

    人工智能概论 2023年5月25日
    00
  • 详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点

    下面我就详细讲解一下“详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点”的完整攻略。 1. 背景介绍 在一台服务器上部署多个站点是非常常见的需求,因为这可以在一定程度上节约服务器资源。但是,如果不加以合理的优化,可能会导致服务器运行缓慢、响应不及时等问题。因此,我们需要一种高效的方法来在一台服务器上部署多个站点。 本文将介绍如…

    人工智能概览 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部