Python - sistema de autenticación de Django módulo de autenticación y Jwt

autentificación de inicio de sesión aplicación de back-end

sistema de autenticación por defecto de Django se ha proporcionado módulo de autenticación. sistema de autenticación incluye:

  • Gestión de usuarios
  • Permisos [RBAC]
  • Grupo de Usuarios [grupo de funciones]
  • sistema de hash de la clave
  • Los usuarios inician o mostrar el contenido de formularios y vistas
  • A los sistemas de back-end enchufables

mecanismo de autenticación de usuario por defecto de Django se basa mecanismo de la sesión, se introduce el mecanismo de autenticación JWT en el proyecto, la identidad de las credenciales de usuario almacenadas en la cadena de emergencia, y luego de atracar sistema de autenticación de Django, que nos ayude a lograr:

  • modelo de datos de usuario
  • cifrado de la contraseña de usuario y autenticación
  • sistema de permisos de usuario

Django clase de modelo de usuario

sistema de autenticación de Django proporciona un usuario de la clase modelo de usuario para guardar los datos del usuario, el usuario por defecto contiene los siguientes campos básicos comunes:

nombre del campo campo Descripción
username Requerido. 150 caracteres o menos. Los nombres de usuario pueden contener _alfanuméricos, @,, + .y -caracteres.
first_name Opcional blank=True(). Menor o igual a 30 caracteres.
last_name Opcional blank=True(). Menor o igual a 30 caracteres.
email Opcional blank=True(). Dirección de correo electrónico.
password Requerido. cadena de la contraseña hash. (Django no guarda la contraseña original). contraseña original puede ser infinitamente largo y puede contener cualquier carácter.
groups Y Groupmuchas relaciones entre.
user_permissions Y Permissionmuchas relaciones entre.
is_staff valor booleano. Es un conjunto de usuarios administradores pueden acceder al sitio.
is_active valor booleano. Lo que indica que la cuenta de usuario está activa. No se utiliza para controlar si el usuario puede iniciar sesión en, pero describe el uso de un estado de la cuenta.
is_superuser Si se trata de súper usuario. Super Usuario tiene todos los derechos.
last_login La última vez que el usuario ha iniciado sesión.
date_joined Tiempo cuentas creadas. Cuando se crea la cuenta, la configuración predeterminada es la fecha / hora actual.
Los métodos más comunes:
  • set_password( Raw_password )

    Establecer la contraseña del usuario a la cadena prima dada, y es responsable de la contraseña. No guarda Userel objeto. Como Nonees raw_password, la contraseña se establece en una contraseña inutilizable.

  • check_password( Raw_password )

    Si raw_password dada es verdadera la contraseña del usuario, devuelve True, puede utilizar al validar una contraseña de usuario.

Método Manager:

Método Manager que es por User.objects.llamada al método.

  • create_user( Nombre de usuario , correo electrónico = Ninguno , password = Ninguno , * * extra_fields )

    Crear, guardar y devolver un Userobjeto.

  • create_superuser( Nombre de usuario , correo electrónico , contraseña , * * extra_fields )

    La create_user()misma, pero la configuración is_staffy is_superuseral True.

Crear módulo de aplicación de usuario secundario

cd luffyapi/apps/
python ../../manage.py startapp users

sub-aplicaciones registradas en el archivo settings.py.

INSTALLED_APPS = [
		...
  	'users',
]

Crear una clase del modelo definido por el usuario

sistema de autenticación de Django clase de modelo de usuario y el procedimiento proporcionan una muy conveniente, podemos utilizar esta clase de modelo, pero algunos campos no pueden satisfacer las necesidades del proyecto, ya que las necesidades de los proyectos que se guardan en el número de teléfono del usuario, es necesario añadir campos adicionales a la clase del modelo.

Django proporciona django.contrib.auth.models.AbstractUsera los usuarios una clase modelo abstracto nos permite heredar, uso de campo extendido clase de modelo del sistema de autenticación de usuarios de Django.

Podemos crear un usuarios de la aplicación de Django en aplicaciones, los usuarios registrados y aplicaciones en el archivo de configuración.

El usuario define las clases del modelo de usuario para crear buenas aplicaciones en models.py.

from django.db import models

# Create your models here.
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
    mobile = models.CharField(max_length=15, unique=True, verbose_name="手机号码")
    avatar = models.ImageField(upload_to="avatar", null=True, blank=True, verbose_name="头像")
    
    class Meta:
        db_table = 'ly_users'
        verbose_name = '用户'
        verbose_name_plural = verbose_name

modelo de usuario nuestra clase personalizada no se puede identificar directamente el sistema de autenticación de Django, un sistema de autenticación usando Django necesidad de informar a las clases de modelo personalizado en el archivo de configuración.

Establecido en el archivo de configuración

AUTH_USER_MODEL = 'users.User'

AUTH_USER_MODELConfiguración de los parámetros a 点.ser separado, expresado 应用名.模型类名.

Nota: Django sugirió que nos fijamos para AUTH_USER_MODEL parámetros deben ser antes de que se estableció la primera migración de base de datos, de lo contrario se puede producir error desconocido uso posterior.

Realizar una migración de base de datos

python manage.py makemigrations
python manage.py migrate

Ejecutar python manage.py migratecomando: sistema dado similar al siguiente:

django.db.migrations.exceptions.InconsistentMigrationHistory: Migration reversion.0001_squashed_0004_auto_20160611_1202 is applied before its dependency users.0001_initial on database 'default'.

Se trata de un hombre llamado reversión de las sub-aplicaciones que utilizan los usuarios obsoletos modelo original, pero ahora la base de datos se ha establecido como la sub-aplicación por defecto usersdel modelo, por lo que tuvo un conflicto. Así que este conflicto, tenemos que borrar toda la información de los archivos originales y la migración de bases de datos se pueden resolver.

información de la base de datos de copia de seguridad

数据库备份   哪一张数据库那一张表(luffy)   库下的表直接点(luffy.)
mysqldump -uroot -p123456 luffy > luffy_2019_12_19.sql
解决步骤:
1. 备份数据库,删除关于用户原来的数据表信息和表结构[如果刚开始开发,则直接清除库中所有数据表即可。
2. 删除apps下面的所有子应用中migrations目录下除了__init__.py以外的所有迁移文件
3. 删除在django.contrib.admin和django.contrib.auth模块里面的migrations迁移文件,除了__init__.py
4. 删除在xadmin和reversion模块中的migrations的迁移文件,除了__init__.py。
5. 执行数据迁移,把备份数据,除了用户以外的全部恢复执行即可。
6. 使用manage.py createsuperuser创建管理员即可

Django RESTO marco JWT

Después de que el registro de usuario o de inicio de sesión, queremos registrar el estado de conexión del usuario, o crear credenciales de autenticación para el usuario. Ya no usamos el mecanismo de autenticación de sesión, utilice el mecanismo de autenticación del token web JSON.

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

constitución de JWT

JWT de una cuerda porTres piezas de informaciónCompuesto, con estas tres piezas de texto de información .con enlaces constituyen cadena Jwt. De esta manera:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

La primera parte se llama la cabeza (cabecera), la segunda parte que llamamos la carga (carga útil, similar a los objetos transportados en el avión), y la tercera parte es la visa (firma).

JWT cabeza lleva dos tipos de información:

  • Declarado tipo, aquí está jwt
  • Aserción del algoritmo de cifrado se utiliza generalmente directamente HMAC SHA256

cabeza completa como esta en JSON:

{
  'typ': 'JWT',
  'alg': 'HS256'
}

A continuación, la cabeza base64-encriptación (el cifrado puede ser descifrado simétrico), constituye la primera parte.

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

carga útil

Cargar el almacenamiento local es información válida. El nombre se refiere específicamente a tales mercancías transportadas en la aeronave, estos información eficaz consta de tres partes

  • Declaración de
  • Declaración pública
  • declaración privada

declaración de registro estándar (recomendado, pero no es obligatorio para el uso):

  • ISS JWT emisor
  • Sub JWT para el usuario
  • MXN : el lado de recepción jwt
  • exp : tiempo de expiración JWT, la fecha de caducidad debe ser mayor que la cuestión del tiempo
  • NBF : ¿A qué hora se define antes de la JWT no están disponibles.
  • IAT JWT la cuestión del tiempo
  • la ITC : JWT identidad única, se utiliza principalmente como una muestra de una sola vez, con el fin de evitar un ataque de repetición.

Declaración pública : declaraciones públicas pueden añadir cualquier información, información general sobre el usuario para añadir la información necesaria u otras necesidades del negocio, pero no se recomienda para obtener información sensible a añadir, ya que la parte del cliente puede descifrar.

declaración privada : declaración privada es una declaración de los proveedores y consumidores como definición común, generalmente no se recomienda para almacenar información sensible, debido base 64 se descifran simétrica, lo que significa que parte de la información se pueden clasificar como texto sin formato.

Definir una carga útil:

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true,
  "history": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9"
}

Entonces base64 cifrado, para dar una segunda porción de la JWT.

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9

firma

JWT es la tercera parte de una información sobre visados, esta información visado consta de tres partes:

  • cabecera (después de la base64)
  • carga útil (después de la base64)
  • secreto

Y después de base 64 después de que las necesidades de la pieza de cabecera para cifrar la carga útil cifrada usando base64 .composición concatenación de cadenas, y luego por la cabecera de cifrado sal declarada en secretel cifrado de combinación, y la tercera parte constituye el JWT.

// javascript
var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);

var signature = HMACSHA256(encodedString, 'secret'); // TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

Estas tres piezas con .una cadena completa conectada, constituye el final de JWT:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

Nota: secreta se almacena en el servidor, el problema generado JWT también en el lado del servidor, secreto se utiliza para autenticar la emisión y jwt de JWT, por lo que es clave privada del servidor, en cualquier escenario no debe ser revelada a seguir. Una vez que el cliente ha aprendido el secreto, que significa que el cliente puede ser auto-firmado por JWT.

jwt的优点:
1. 可以很方便的完成分布式站点的单点登录
2. jwt主要保存在客户端,服务器只需要保存秘钥,所有降低服务器的存储眼里
3. jwt的载荷可以存储一些数据发送给客户端,客户端可以查看对应的载荷中的数据,所以可以用户进行双方数据传输

jwt的缺点:
1. jwt实现比传统的session要复杂
2. jwt的信息保存在客户端,所以一经发放,无法回收。在此过程中,不好控制。保存在客户端部的数据容易被用户操作。

Para la emisión y verificación de JWT, podemos utilizar la extensión para Django RESTO marco JWT al completo.

documentación Sitio Web

configuración de la instalación JWT

instalar

pip install djangorestframework-jwt

configuración

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
    ),
}
import datetime
JWT_AUTH = {
    # 设置客户端的jwt的exp的有效期为1天
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
}
  • JWT_EXPIRATION_DELTA especifica token válido

generar jwt

Django REST extensión marco JWT de la documentación proporciona un método de manual de emitido por JWT

Tenga en cuenta que este código se registrará en el tiempo, vamos a utilizar para.

from rest_framework_jwt.settings import api_settings

jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)

Después de que el registro del usuario o ingresar sin problemas, devuelve la información del usuario en el serializador en el futuro y vuelve testigo puede ser.

Interfaz de inicio de sesión de autenticación de la aplicación de back-end

marco Django REST JWT proporciona una vista de la obtención de contador de inicio de sesión puede ser utilizado directamente

En sub-aplicación de enrutamiento en urls.py

from rest_framework_jwt.views import obtain_jwt_token

urlpatterns = [
    path(r'login/', obtain_jwt_token),
]

En las rutas principales, la introducción del archivo actual de enrutamiento sub-aplicación

urlpatterns = [
		...
    path('users/', include("users.urls")),
    # include 的值必须是 模块名.urls 格式,字符串中间只能出现一个圆点
]

A continuación, puede probar las siguientes funciones de cartero

2.3.7 front-end para guardar jwt

Podemos JWT guardado en una cookie también se pueden almacenar en la memoria local del navegador, hemos ahorrado en el navegador de almacenamiento local

navegador tienda local ofrece sessionStorage y localStorage dos maneras:

  • sessionStorage navegador se cierra, caducará
  • localStorage eficaz a largo plazo

uso

sessionStorage.变量名 = 变量值   // 保存数据
sessionStorage.setItem("变量名","变量值");  // 保存数据
sessionStorage.变量名  // 读取数据
sessionStorage.getItem("变量名")  // 读取数据
sessionStorage.removeItem("变量名") // 删除一个数据
sessionStorage.clear()  // 清除所有sessionStorage保存的数据

localStorage.变量名 = 变量值   // 保存数据
localStorage.setItem("变量名","变量值");  // 保存数据
localStorage.变量名  // 读取数据
localStorage.getItem("变量名")  // 读取数据
localStorage.removeItem("变量名") // 删除一个数据
localStorage.clear()  // 清除所有sessionStorage保存的数据

2.3.9 multi-condición de registro

JWT extendió vista de inicio de sesión, cuando se recibe un nombre de usuario y contraseña, pero también llaman ** sistema de autenticación de Django autenticar proporcionada por () ** para comprobar el nombre de usuario y la contraseña son correctos.

Podemos apoyar la cuenta de inicio de sesión mediante la modificación del sistema de autenticación de Django autenticación backend (método principalmente autenticar) puede ser un nombre de usuario o un número de teléfono.

Modificar las necesidades de autenticación backend Django autenticación del sistema para heredar django.contrib.auth.backends.ModelBackend, y anular el método de autenticar.

authenticate(self, request, username=None, password=None, **kwargs)Parámetro Descripción método:

  • El objeto de solicitud de petición de autenticación
  • Nombre de usuario cuenta con esta certificación proporcionada
  • Esto proporciona la contraseña de autenticación de contraseña

Queremos que los usuarios inician sesión, ya sea en el nombre de usuario, también puede iniciar sesión en el número de teléfono, a continuación, para el método de autenticar, medios de parámetros nombre de usuario que el nombre de usuario o número de teléfono.

Ideas reescribir método Authenticate:

  1. De acuerdo a localizar el parámetro objeto de usuario Nombre de usuario, el parámetro de nombre de usuario puede ser un nombre de usuario, puede ser el número de teléfono
  2. Si se puede encontrar el objeto usuario, llamar al método check_password para comprobar si el objeto Usuario contraseña correcta

Escribir en los usuarios / utils.py en:

# jwt自定义返回函数
def jwt_response_payload_handler(token, user=None, request=None):
    """
    自定义jwt认证成功返回数据
    :parameter token 本次响应给客户端的jwt字符串
    :parameter user  本次查询出来的用户模型对象
    :parameter request  本次客户端的请求对象
    """
    return {
        'token': token,
        'id': user.id,
        'username': user.username
    }


"""自定义用户多条件认证"""
# pycharm自动导包 快捷键: 光标移动到对应的类名中,使用 Alt + Enter
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q


def get_account_by_user(username):
    """根据username获取用户信息"""
    from .models import User
    try:

        user = User.objects.get(Q(username=username) | Q(mobile=username))
    except User.DoesNotExist:
        user = None
    return user

class UsernameMobileAuthBackend(ModelBackend):
    """实现用户多条件登录"""
    def authenticate(self, request, username=None, password=None, **kwargs):
        user = get_account_by_user(username)
        if user is not None and user.check_password(password) and user.is_active:
            return user

Django informó en la configuración del archivo de configuración / uso dev.py nuestro motor de autenticación personalizada

AUTHENTICATION_BACKENDS = [
    'users.utils.UsernameMobileAuthBackend',
]

Supongo que te gusta

Origin www.cnblogs.com/zhaoganggang/p/12570819.html
Recomendado
Clasificación