下面是关于 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)
我们可以通过实现 CASLoginView
和 CASLogoutView
来实现 CAS 认证后跳转到原网站。
其中,CASLoginView
的 form_valid
方法中添加了一个 redirect
函数,通过拼接当前访问的 URL 中的 next
参数来实现跳转。
CASLogoutView
与 CASLoginView
实现类似。
结合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
视图中,我们需要使用 SessionAuthentication
和 BasicAuthentication
这两个认证类,且需要使用 cas_mama_required
装饰器来实现 CAS 认证。
结语
以上便是关于 Python Django 集成 CAS 验证系统的完整攻略,希望能帮助到您。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python django集成cas验证系统 - Python技术站