承接上一篇:Django知识点总结-CSDN博客
目录
25.使用 Django REST framework实现用户认证和授权
26.通过djangorestframework-simplejwt使用JWT(JSON Web Token)
27.使用django-auth-ldap进行用户认证
28. 使用django-cas-ng实现集中认证及实现单点登录
29. Google双因素认证
30.使用钉钉认证
25.使用 Django REST framework实现用户认证和授权
在Django REST framework (DRF) 中实现用户认证和授权是一个常见的需求,用于确保API的安全性。以下是实现用户认证和授权的步骤和示例:
25.1 配置认证和权限类
在视图或视图集中配置认证类来启用认证,以及配置权限类来控制用户对API的访问。
from rest_framework import viewsets, permissions
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
# 使用TokenAuthentication进行认证
authentication_classes = [rest_framework.authentication.TokenAuthentication]
# 仅允许管理员用户创建新用户
def get_permissions(self):
if self.action == 'create':
permission_classes = [permissions.IsAdminUser]
else:
permission_classes = [permissions.IsAuthenticated]
return [permission() for permission in permission_classes]
25.2 创建Token模型
DRF提供了一个内置的Token模型,用于生成和存储用户的认证令牌。
from rest_framework.authtoken.models import Token
from django.contrib.auth.models import User
token, created = Token.objects.get_or_create(user=user)
25.3 为Token认证创建URL
在项目的URL配置中,添加用于获取或刷新Token的路由。
from django.urls import path
from rest_framework.authtoken.views import obtain_auth_token, refresh_auth_token
urlpatterns = [
# ... 其他URL配置
path('api-token-auth/', obtain_auth_token),
path('api-token-refresh/', refresh_auth_token),
]
25.4 用户登录和获取Token
用户可以通过标准的登录视图登录并获取Token。DRF提供了一个TokenCreateView
,可以用于创建Token。
from rest_framework.authtoken.views import TokenCreateView
urlpatterns = [
# ... 其他URL配置
path('api-token/', TokenCreateView.as_view()),
]
25.5 使用Token进行API请求
一旦用户获得了Token,他们就可以将其作为请求的一部分来访问受保护的API。
GET /api/users/ HTTP/1.1
Authorization: Token <token_key>
Host: example.com
25.6 刷新Token
Token可能会过期,因此需要刷新。DRF提供了一个Token
模型的方法来处理Token的刷新。
from rest_framework.authtoken.models import Token
# 刷新Token
def refresh_token(token):
return Token.objects.filter(key=token).update(expires_at=timezone.now() + datetime.timedelta(days=1))
25.7 自定义认证和权限
如果需要更复杂的认证逻辑,可以创建自定义的认证类和权限类。
from rest_framework import authentication, permissions
class CustomAuthentication(authentication.BaseAuthentication):
# 自定义认证逻辑
class CustomPermission(permissions.BasePermission):
# 自定义权限逻辑
然后在视图或视图集中使用这些自定义类。
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
authentication_classes = [CustomAuthentication]
permission_classes = [CustomPermission]
通过以上步骤,你可以使用Django REST framework实现用户认证和授权,确保API的安全性和数据的保护。
26.通过djangorestframework-simplejwt使用JWT(JSON Web Token)
djangorestframework-simplejwt
是一个为 Django REST framework 提供 JSON Web Token (JWT) 认证支持的库。它使得在 API 中使用 JWT 成为可能,而无需自己实现 JWT 的编码和解码过程。
26.1 安装
首先,你需要安装 djangorestframework-simplejwt
。可以通过 pip 来安装:
pip install djangorestframework-simplejwt==5.2.0
26.2 配置
安装后,你需要在 Django 项目的 settings.py
文件中进行一些配置:
26.2.1 添加 rest_framework_simplejwt
到 INSTALLED_APPS
。
INSTALLED_APPS = [
# ...
'rest_framework_simplejwt',
]
26.2.2 设置JWT相关的配置,例如令牌有效期等;
from datetime import timedelta
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
}
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),
'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
'ROTATE_REFRESH_TOKENS': True,
'BLACKLIST_AFTER_ROTATION': True,
'ALGORITHM': 'HS256',
'SIGNING_KEY': SECRET_KEY,
'VERIFYING_KEY': None,
'AUTH_HEADER_TYPES': ('Bearer',),
'USER_ID_FIELD': 'id',
'USER_ID_CLAIM': 'user_id',
'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
}
26.3 使用
djangorestframework-simplejwt
提供了用于生成和验证 JWT 的视图和序列化器:
获取访问令牌和刷新令牌
from rest_framework_simplejwt.tokens import RefreshToken
def create_token(user):
return RefreshToken.for_user(user)
Token视图
DRF 提供了一个 TokenCreateView
,它允许用户通过标准的用户名和密码认证来获取 JWT。
from rest_framework_simplejwt.views import TokenCreateView
urlpatterns = [
# ... 其他 URL 配置
path('api/token/', TokenCreateView.as_view(), name='token_create'),
]
黑名单和刷新令牌
djangorestframework-simplejwt
允许你将令牌添加到黑名单中,以阻止它们的使用。当刷新令牌被使用时,旧的令牌将被黑名单,并生成一个新的刷新和访问令牌。
from rest_framework_simplejwt.tokens import OutstandingTokenFilter
# 黑名单一个令牌
OutstandingTokenFilter().blacklist(token)
自定义令牌
如果需要,你可以自定义令牌类,以添加额外的声明或更改令牌的行为。
from rest_framework_simplejwt.tokens import AccessToken
class MyAccessToken(AccessToken):
@classmethod
def create(cls, *args, **kwargs):
token = super().create(*args, **kwargs)
# 自定义令牌逻辑
return token
然后在 SIMPLE_JWT
设置中指定自定义令牌类:
SIMPLE_JWT['AUTH_TOKEN_CLASSES'] = ('path.to.MyAccessToken',)
通过使用 djangorestframework-simplejwt
,你可以快速地为你的 Django REST framework 项目添加 JWT 认证,而无需从头开始实现认证逻辑。
27.使用django-auth-ldap进行用户认证
django-auth-ldap
是一个 Django 认证后端,它允许 Django 应用通过 LDAP (轻型目录访问协议) 服务进行用户认证。LDAP 通常用于组织内的用户身份验证和目录管理。使用 django-auth-ldap
,你可以将 Django 用户认证委托给 LDAP 服务器,从而实现集中式用户管理。
27.1 安装django-auth-ldap
pip install django-auth-ldap==4.1.0
在windows系统可能会安装不成功,参考我之前写的解决方案:Django项目无法安装python-ldap依赖解决方案-CSDN博客
27.2 在 Django 项目的 settings.py
文件中,需要添加 django-auth-ldap
相关的配置:
AUTHENTICATION_BACKENDS = [
'django_auth_ldap.backend.LDAPBackend',
'django.contrib.auth.backends.ModelBackend', # 用于本地数据库认证
]
import ldap
from django_auth_ldap.config import LDAPSearch, GroupOfUniqueNamesType
AUTH_LDAP_SERVER_URI = "ldap://your.ldap.server" # LDAP服务器地址
AUTH_LDAP_BIND_DN = "cn=binduser,dc=example,dc=com" # LDAP绑定用户
AUTH_LDAP_BIND_PASSWORD = "password" # LDAP绑定用户密码
AUTH_LDAP_USER_SEARCH = LDAPSearch(
"ou=users,dc=example,dc=com",
ldap.SCOPE_SUBTREE,
"(uid=%(user)s)"
)
AUTH_LDAP_USER_ATTR_MAP = {
"first_name": "givenName",
"last_name": "sn",
"email": "mail"
}
AUTH_LDAP_GROUP_SEARCH = LDAPSearch(
"ou=groups,dc=example,dc=com",
ldap.SCOPE_SUBTREE,
"(objectClass=groupOfUniqueNames)"
)
AUTH_LDAP_GROUP_TYPE = GroupOfUniqueNamesType()
AUTH_LDAP_REQUIRE_GROUP = "cn=django_users,ou=groups,dc=example,dc=com" # 用户必须属于的组
AUTH_LDAP_DENY_GROUP = "cn=denied_users,ou=groups,dc=example,dc=com" # 用户不能属于的组
# 启用后,Django将使用LDAP组来确定用户的staff和superuser状态
AUTH_LDAP_USER_FLAGS_BY_GROUP = {
"is_active": "cn=active_users,ou=groups,dc=example,dc=com",
"is_staff": "cn=staff,ou=groups,dc=example,dc=com",
"is_superuser": "cn=superuser,ou=groups,dc=example,dc=com"
}
# 如果设置为True,则Django将为用户创建本地账户,即使用户之前未在Django中创建过账户
AUTH_LDAP_ALWAYS_UPDATE_USER = True
27.3 一旦配置完成,就可以使用了,用户就可以通过 LDAP 服务器进行认证。如果用户在 Django 中不存在,并且 AUTH_LDAP_ALWAYS_UPDATE_USER
设置为 True
,则会自动创建一个新用户。
27.4 django-auth-ldap
还提供了两个信号:ldap_error
和 populate_user
,允许你在认证过程出错或在用户被创建时进行自定义操作。
注意事项:
- 请确保 LDAP 服务器地址、绑定用户和密码正确无误。
- 根据你的 LDAP 服务器结构,可能需要调整
AUTH_LDAP_USER_SEARCH
和AUTH_LDAP_GROUP_SEARCH
。 - 如果 LDAP 服务器使用 SSL,
AUTH_LDAP_SERVER_URI
应使用ldaps://
而不是ldap://
。
django-auth-ldap
提供了丰富的配置选项,可以满足不同规模和需求的 LDAP 集成
28. 使用django-cas-ng实现集中认证及实现单点登录
28.1 安装django-cas-ng
pip install django-cas-ng==4.3.0
28.2 在 Django 项目的 settings.py
文件中,进行以下配置:
添加django_cas_ng
INSTALLED_APPS = [
# ...
'django_cas_ng',
# ...
]
配置CAS相关的 AUTHENTICATION_BACKENDS
:
AUTHENTICATION_BACKENDS = [
'django_cas_ng.backends.CASBackend',
# 'django.contrib.auth.backends.ModelBackend' # 如果需要,保留本地数据库认证
]
设置CAS相关的参数
CAS_SERVER_URL = 'https://sso.example.com/cas'
CAS_LOGOUT_COMPLETELY = True # 是否在 CAS 服务器登出时完全登出
CAS_CREATE_USER = True # 如果用户在 CAS 服务器上存在但在 Django 中不存在,则自动创建用户
28.3 使用过程
28.3.1 创建CAS视图:
如果需要一个用于 CAS 认证的视图,可以重用 django-cas-ng
提供的视图:
from django.urls import path
from django_cas_ng.views import LoginView, LogoutView
urlpatterns = [
path('cas_login/', LoginView.as_view(), name='cas_login'),
path('cas_logout/', LogoutView.as_view(), name='cas_logout'),
]
28.3.2 在模板中使用CAS认证:
在 Django 模板中,可以使用 django-cas-ng
提供的模板标签来检查用户是否已经通过 CAS 认证:
{% if user.is_authenticated %}
<p>Welcome, {{ user.username }}. You are logged in via CAS.</p>
{% else %}
<p><a href="{% url 'cas_login' %}">Login with CAS</a></p>
{% endif %}
28.3.3 处理CAS回调
当用户通过 CAS 服务器登录后,CAS 服务器会重定向用户回一个预定义的服务 URL。这个 URL 通常是你的 Django 应用中的一个视图,该视图需要处理 CAS 认证的回调:
from django_cas_ng.views import ServiceLoginView
class CASLoginView(ServiceLoginView):
backend = 'django_cas_ng.backends.CASBackend'
单点登出
django-cas-ng
支持单点登出。当用户点击登出链接时,可以选择是否完全登出,这取决于 CAS_LOGOUT_COMPLETELY
设置。
注意事项:
- 确保 CAS 服务器的 URL 配置正确。
- 如果需要同时使用本地数据库认证和 CAS 认证,可以保留
ModelBackend
。 - 如果
CAS_CREATE_USER
设置为True
,确保 Django 用户模型的字段能够接受 CAS 用户信息的映射。 - Windows系统中运行项目会提示安装MIT Kerberos(下载地址:MIT Kerberos Distribution Page),下载后将可执行文件路径添加到系统的环境变量中
通过使用 django-cas-ng
,你可以轻松地将 Django 应用与 CAS 服务器集成,实现单点登录功能。
最后介绍一下这个Kerberos的使用方法
安装之后需要配置:需要配置Kerberos客户端,这通常涉及编辑krb5.conf
文件,该文件包含了Kerberos的配置信息,如KDC服务器的地址等。
使用:
-
获取Kerberos票据: 使用
kinit
命令获取Kerberos票据。如果没有keytab文件,可以使用用户名和密码进行认证:
kinit username@REALM
如果使用keytab文件,可以使用:
kinit -kt username.keytab username@REALM
2.显示票据: 使用klist
命令查看当前获取的Kerberos票据。
klist
3.销毁票据: 不再需要票据时,可以使用kdestroy
命令销毁它们。
kdestroy
浏览器配置:
如果需要通过浏览器访问Kerberos保护的服务,可能还需要对浏览器进行配置,以确保它能够使用Kerberos票据进行认证。
注意事项
- 确保Kerberos服务端(KDC)已经正确配置并且可以正常工作。
- 在配置过程中,需要注意Kerberos域(REALM)的大小写,它们通常是大写的。
- 如果在配置过程中遇到问题,可以查看MIT Kerberos的官方文档或社区支持。
29. Google双因素认证
在Django项目中使用Google Authenticator进行二次验证(也称为多因素认证,MFA),可以增加账户的安全性。Google Authenticator是一个基于时间的一次性密码(TOTP)生成器,用户可以通过Google Authenticator应用程序生成密码,以验证他们的身份。
以下是在Django项目中整合Google Authenticator的一般步骤:
29.1 安装相关包
首先,你需要安装django-otp
和django-two-factor-auth
,这些包可以帮助你实现多因素认证:
pip install django-otp django-two-factor-auth qrcode
29.2 配置
在settings.py
中添加必要的配置:
INSTALLED_APPS = [
# ...
'django_otp',
'django_otp.plugins.otp_totp',
'two_factor',
# ...
]
MIDDLEWARE = [
# ...
'django_otp.middleware.OTPMiddleware',
# ...
]
AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.ModelBackend',
'two_factor.auth_backends.MultiFactorAuthBackend',
]
29.3 URL配置
在项目的urls.py
中添加django-two-factor-auth
的URL模式:
from django.urls import path, include
urlpatterns = [
# ...
path('accounts/', include('django.contrib.auth.urls')),
path('accounts/', include('two_factor.urls', 'two_factor')),
# ...
]
29.4 迁移数据库
运行迁移命令以更新数据库:
python manage.py migrate
29.5 模板整合
如果需要,可以创建自定义模板并将其路径添加到settings.py
的TEMPLATES
配置中。
29.6 使用Google Authenticator
django-two-factor-auth
会自动生成QR码,用户可以使用Google Authenticator应用扫描QR码并注册账户。之后,每次登录时,除了输入用户名和密码外,还需要输入由Google Authenticator生成的6位验证码。
从手机应用商店下载Google Authenticator或者Microsoft Authenticator;我下载的是微软的
打开之后,扫描二维码,绑定对应的网站ip,以后直接打开就是这样的,验证的时候直接输入6位验证码,过期时间非常短,只有30s左右
29.7 启动服务器
运行Django开发服务器
python manage.py runserver
注意事项:
- 确保在部署到生产环境之前,已经正确配置了所有安全相关的设置。
- 用户需要安装Google Authenticator应用,并能够访问生成的验证码。
- 考虑到用户可能会丢失手机或无法访问Google Authenticator应用,建议提供备用的认证方法或恢复选项。
通过上述步骤,你可以在Django项目中启用基于Google Authenticator的多因素认证,从而提高账户的安全性。
30.使用钉钉认证
django-auth-dingding
是一个 Django 应用程序,它提供了使用钉钉账号登录 Django 应用的功能。以下是它的使用方法和一些关键特性的概述:
关键特性
- 钉钉认证:允许用户使用钉钉账号进行认证。
- 自定义用户模型:支持自定义用户模型。
- 回调URL配置:需要配置钉钉应用的回调URL。
- 环境变量:通过环境变量设置钉钉应用的密钥和回调URL。
30.1 安装 django-auth-dingding
包
pip install django-auth-dingding==0.0.3
30.2 在 INSTALLED_APPS
中添加 django_auth_dingding
INSTALLED_APPS = [
# ...
'django_auth_dingding',
]
30.3 在项目的 urls.py
中包含 django_auth_dingding
的 URL配置:
from django.urls import path, include
urlpatterns = [
# ...
path('dingding/', include("django_auth_dingding.urls")),
]
30.4 在 settings.py
中添加钉钉认证的配置:
AUTHENTICATION_BACKENDS = (
"django_auth_dingding.auth.DingdingAuthenticationBackend",
"django.contrib.auth.backends.ModelBackend",
)
DINGDING_AUTH_APP_KEY = "your_app_key" # 钉钉应用的app key
DINGDING_AUTH_APP_SECRET = "your_app_secret" # 钉钉应用的app secret
DINGDING_AUTH_AUTHENTICATION_CALLBACK_URL = "http://yourdomain.com/dingding/callback/"
30.5 如果你的用户模型是自定义的,需要在用户模型中添加 ding_user_id
字段:
from django.contrib.auth.models import AbstractUser
from django.db import models
class Users(AbstractUser):
ding_user_id = models.CharField("钉钉UserID", max_length=64, blank=True)
30.6 运行迁移来更新数据库:
python manage.py migrate
30.7 用户可以通过访问 http://{host}:{port}/dingding/authenticate/
来开始钉钉认证流程
注意事项:
- 确保你已经在钉钉开放平台上注册了应用并获取了
app key
和app secret
。 - 确保回调URL与在钉钉平台上配置的一致。
- 如果使用自定义用户模型,请确保添加了
ding_user_id
字段。
django-auth-dingding
允许Django开发者轻松集成钉钉认证,为用户提供便捷的登录方式
最近接手的这个项目,就搞了这么多的验证方式,导致项目运行认证的时候,总是出错,有点头疼。还在一步一步排查问题解决中。由于用的前端框架也比较老,用的jquery,导致浏览器也报了一堆莫名其妙的错误。