Django——认证

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37049781/article/details/85103851

登录就是认证,上一篇简单说了登录。认证是对身份的识别,出现的场景更加多样。

django自带auth模块使用

登录中的实现方法基本都是采用django auth模块里的。
1.引入auth模块url
from django.contrib.auth import urls as auth_urls
url(r'^accounts/', include(auth_urls, namespace='accounts')),
该路由下有以下rul:
在这里插入图片描述
2.配置相关页面模版文件

TEMPLATES = [
    {
        ...
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        ...
    },
]
# auth相关页面放在templates下registration目录中
# 模版可以参考源码中django/contrib/auth/templates/registration

3.启用密码验证

# settings.py
AUTH_PASSWORD_VALIDATORS = [
    {	# 检查密码和用户某些属性的相似性
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {	# 检查密码的最小长度(默认8)
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
        'OPTIONS': {
            'min_length': 9,
        }
    },
    {	# 检查密码是否出现在常用密码表中
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {	# 检查密码是否全为数字
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

或者是直接使用已经是配好的包(django-user2)

安装模块pip install django-user2
注册app

INSTALLED_APPS = (
    ...
    'django.contrib.auth',
    'django.contrib.sites',
    'users',
    ...
)
# 指定用户数据模型
AUTH_USER_MODEL = 'users.User'

# django 官方推荐自定义用户模型(即使默认user模型完全能够满足你的需求, 这样你可以在后期很方便的扩展它)
## models.py ##
# from django.contrib.auth.models import AbstractUser
# class User(AbstractUser):
#     pass
## settings.py ##
# AUTH_USER_MODEL = 'users.User'
## admin.py ##
# from django.contrib import admin
# from django.contrib.auth.admin import UserAdmin
# from .models import User
# admin.site.register(User, UserAdmin)

# 如果你的项目已经开始了想更改,参考 https://docs.djangoproject.com/en/1.11/topics/auth/customizing/#s-changing-to-a-custom-user-model-mid-project

设置路由

urlpatterns = patterns('',
    ...
    url(r'^accounts/', include('users.urls')),
    ...
)

设置

USERS_REGISTRATION_OPEN = True					# 是否开放注册
USERS_VERIFY_EMAIL = True						# 为注册用户启用电子邮件验证
USERS_AUTO_LOGIN_ON_ACTIVATION = True			# 激活后自动登录用户
USERS_EMAIL_CONFIRMATION_TIMEOUT_DAYS = 3		# 注册后激活账户时限(天)
USERS_PASSWORD_MIN_LENGTH = 5					# 密码最短位数
USERS_PASSWORD_MAX_LENGTH = None				# 密码最长位数
USERS_CHECK_PASSWORD_COMPLEXITY = True		# 检验密码强度
USERS_PASSWORD_POLICY = {						#包含字符位数
        'UPPER'0,#Uppercase'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
        'LOWER'0,#Lowercase'abcdefghijklmnopqrstuvwxyz'
        'DIGITS'0,#Digits'0123456789'
        'PUNCTUATION'0#标点符号“”“!”#$%&'()* +-/; <=>?@ [\] ^ _` {|}〜“”“
}
USERS_SPAM_PROTECTION = False					# 防止垃圾邮件程序自动注册
USERS_VALIDATE_EMAIL_DOMAIN = True				# 禁止特定域邮件注册
USERS_EMAIL_DOMAINS_BLACKLIST = []				# 不允许域名列表
USERS_EMAIL_DOMAINS_WHITELIST = []				# 允许域名列表
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_USE_TLS = True							# 是否使用tls安全传输协议
EMAIL_HOST = 'smtp.qq.com'
EMAIL_PORT = 25
EMAIL_HOST_USER = '[email protected]'				# 发件邮箱
EMAIL_HOST_PASSWORD = 'xxxx'					# 授权码
DEFAULT_FROM_EMAIL = '[email protected]'	# 发件人

rest-framework框架 token认证

rest中配置中添加权限配置

INSTALLED_APPS = (
    ...
    'rest_framework.authtoken'
)


REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
    	# 默认的auth 使用HTTP、HTTPS的基本验证方式进行身份验证,即username/password验证方式,验证失败则返回HTTP 401 Unauthorized响应。
        'rest_framework.authentication.BasicAuthentication',
        # 使用Django的Session后台框架进行身份验证,验证失败则返回HTTP 403 Forbidden响应。
        'rest_framework.authentication.SessionAuthentication',
        # 基于Token的身份验证方式,客户端在请求时携带有一个Authorization的请求头,和一个以”Token”开头的字符串. 如果验证失败,返回HTTP 401 Unauthorized响应。
        'rest_framework.authentication.TokenAuthentication',
    ),
}

关于三种认证模式间的关系与区别:
在这里插入图片描述
当需要认证的 api 接口接收到请求时,会在view类中auth配置(settinhgs.py中是全局配置),然后根据配置去执行相应的认证行为,认证通过后dispatch会将请求分配给对应的函数处理。
认证过程为 APIView.dispatch -> APIView.initial -> APIView.perform_authentication -> request.user
user是在rest-framework Request.py 中写入。 request._authenticate()函数中对用户定义的DEFAULT_AUTHENTICATION_CLASSES进行遍历验证,分别调用验证类(验证类在rest-framework authentication.py文件中)的authenticate()方法
关于详细使用参考:https://www.django-rest-framework.org/api-guide/authentication/

JWT认证

jwt 指的是json web token,使用的也是token令牌。对于rest-framework的token机制,我们需要创建token与用户的关联表,每次接收到携token请求时需要到数据库中查询出与之对应的用户,然后取出相关信息。而jwt是一个由三段信息构成的json,header头部声明类型与加密算法,payload载荷部分存放一些有效信息,比如签发者 过期时间 签发时间 身份标识等,签证信息部分是将header payload base64加密后用 . 拼接的字符串加上 secret 用声明中的加密方式加密而成。
相对于一般token方式,jwt的不需要在服务器端保存会话信息,而且可以直接获取一些定义的信息而不必执行数据库操作。
详细介绍:https://lion1ou.win/2017/01/18/

安装 pip install djangorestframework-jwt
配置:
DEFAULT_AUTHENTICATION_CLASSES中加入rest_framework_jwt.authentication.JSONWebTokenAuthentication
路由:

urls.py
from rest_framework_jwt.views import obtain_jwt_token

url(r'api-token-auth/', obtain_jwt_token)

使用:
添加header Authoritation JWT token

猜你喜欢

转载自blog.csdn.net/qq_37049781/article/details/85103851