1、Django自带用户认证系统

Django自带用户认证系统,这个系统支持访问控制、注册用户、关联创建者和内容等;在开发用户认证功能时的时候,可以使用Django自带用户认证系统实现;

A、相关表

在使用"python manage.py makemigrationss"和"python manage.py migrate"迁移完成数据库之后

根据配置文件settings.py中的数据库段生成的数据表中已经包含了6张进行认证的数据表,分别是

  • auth_user
  • auth_group
  • auth_group_permissions
  • auth_permission
  • auth_user_groups
  • auth_user_user_permissions

自带用户认证系统,进行用户认证的数据表为auth_user(用户的数据保存在这个表里)

https://docs.djangoproject.com/en/2.0/topics/auth/customizing/

B、使用Django自带的认证功能

B.1 首先要导入auth模块:from django.contrib import auth 

django.contrib.auth常用的三个方法:

authenticate():提供了用户认证,即验证用户名以及密码是否正确,一般需要username和password两个关键字参数

如果通过认证,authenticate()函数会返回一个User对象。

当我们试图登陆一个从数据库中直接取出来不经过authenticate()的User对象时会报错。

B.2 创建用户

user对象

User对象属性:username,password为必填项

password用哈希算法保存到数据库中

  • is_staff:判断用户是否拥有网站的管理权限
  • is_active:判断是否允许用户登陆,设置为“False”时可以不用删除用户来禁止用户登陆

使用create_user辅助函数创建用户

from django.contrib.auth.models import User
user=User.objects.create_user(username="username",password="password")
 

 使用set_password(password)修改密码

from django.contrib.auth.models import User
user=User.objects.get(username="username")  # 获取用户对象
user.set_password(password="password")   # 设置对象的密码
user.save()

login(request)登陆用户

这个函数使用Django的session框架给某个已认证的用户附加上session_id信息。

from django.shortcuts import render,redirect,HttpResponse
from django.contrib.auth import authenticate,login
def auth_view(request):
   username=request.POST.GET("usernmae")  # 获取用户名
   password=request.POST.GET("password")  # 获取用户的密码
   user=authenticate(username=username,password=password) # 验证用户名和密码,返回用户对象
   if user:      # 如果用户对象存在
      login(request,user)   # 用户登陆
      return redirect("/index/")
   else:
      return HttpResponse("用户名或密码错误")

logout(request)注销用户

这个函数接受一个HttpResponse对象,无返回值。

当调用该函数时,当前请求的session信息全部被清除。

即使当前用户没有登陆,调用该函数也不会报错。

使用:

from django.shortcuts import render,redirect,HttpResponse
from django.contrib.auth import authenticate,login,logout
def logout_view(request):
   logout(request)  # 注销用户
   return redirect("/index/")
 

user对象的is_authenticated()

要求:

  • 用户登陆后才能访问某些页面
  • 如果用户没有登陆就访问本应登陆才能访问的页面时会直接跳转到登陆页面
  • 用户在登陆页面登陆后,又会自动跳转到之前访问的页面
def view(request):
  if not request.user.is_authenticated():
      return redirect("/login/")
 

user对象的login_requierd()装饰器

from django.contrib.auth.decorators import login_required
  @login_required
  def views(request):
     pass
 
2、Django自带用户认证系统,用户数据存在自己定义的表
 
用户也可以不使用自带用户认证系统默认的数据表auth_user,通过以下方式可以将用户数据保存到自己定义的表中
from django.contrib.auth.models import Userclass UserProfile(models.Model):    user = models.OneToOneField(User,on_delete=models.CASCADE) # django自带用户表User模块和自定义的用户关联    name = models.CharField(max_length=32)

    def __str__(self):        return self.name

3、自定义用户认证系统
Django 自带的用户认证系统已经可以满足大部分的情况,但是有时候我们需要某些特定的需求。Django 支持使用其他认证系统、也可以扩展Django的User模块,完全自定义新的认证模块。
 
3.1 参考:https://docs.djangoproject.com/en/2.0/topics/auth/customizing/
 
3.2 拷贝以下代码到model文件中:
from django.db import models
from django.contrib.auth.models import (
    BaseUserManager, AbstractBaseUser
)
class MyUserManager(BaseUserManager):    def create_user(self, email, name, password=None):        """        Creates and saves a User with the given email, date of        birth and password.        """        if not email:            raise ValueError('Users must have an email address')

        user = self.model(            email=self.normalize_email(email),            name=name,        )

        user.set_password(password)        user.save(using=self._db)        return user

    def create_superuser(self, email, name, password):        """        Creates and saves a superuser with the given email, date of        birth and password.        """        user = self.create_user(            email,            password=password,            name=name,        )        user.is_admin = True        user.save(using=self._db)        return user

class UserProfile(AbstractBaseUser):    '''账号表'''    email = models.EmailField(        verbose_name='email address',        max_length=255,        unique=True,    )    name = models.CharField(max_length=32)    is_active = models.BooleanField(default=True)    is_admin = models.BooleanField(default=False)

    objects = MyUserManager()

    USERNAME_FIELD = 'email'    REQUIRED_FIELDS = ['name']

    def __str__(self):        return self.email

    def has_perm(self, perm, obj=None):        "Does the user have a specific permission?"        # Simplest possible answer: Yes, always        return True

    def has_module_perms(self, app_label):        "Does the user have permissions to view the app `app_label`?"        # Simplest possible answer: Yes, always        return True

    @property    def is_staff(self):        "Is the user a member of staff?"        # Simplest possible answer: All admins are staff        return self.is_admin
 
注意:email, name等字段都是可以自定义的
 
3.2 在admin.py中添加如下代码:
from django import forms
from django.contrib import admin
from django.contrib.auth.models import Group
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.forms import ReadOnlyPasswordHashField

from customauth.models import MyUser

class UserCreationForm(forms.ModelForm):
    """A form for creating new users. Includes all the required
    fields, plus a repeated password."""
    password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
    password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)

    class Meta:
        model = MyUser
        fields = ('email', 'date_of_birth')

    def clean_password2(self):
        # Check that the two password entries match
        password1 = self.cleaned_data.get("password1")
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError("Passwords don't match")
        return password2

    def save(self, commit=True):
        # Save the provided password in hashed format
        user = super().save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        if commit:
            user.save()
        return user

class UserChangeForm(forms.ModelForm):
    """A form for updating users. Includes all the fields on
    the user, but replaces the password field with admin's
    password hash display field.
    """
    password = ReadOnlyPasswordHashField()

    class Meta:
        model = MyUser
        fields = ('email', 'password', 'date_of_birth', 'is_active', 'is_admin')

    def clean_password(self):
        # Regardless of what the user provides, return the initial value.
        # This is done here, rather than on the field, because the
        # field does not have access to the initial value
        return self.initial["password"]

class UserAdmin(BaseUserAdmin):
    # The forms to add and change user instances
    form = UserChangeForm
    add_form = UserCreationForm

    # The fields to be used in displaying the User model.
    # These override the definitions on the base UserAdmin
    # that reference specific fields on auth.User.
    list_display = ('email', 'date_of_birth', 'is_admin')
    list_filter = ('is_admin',)
    fieldsets = (
        (None, {'fields': ('email', 'password')}),
        ('Personal info', {'fields': ('date_of_birth',)}),
        ('Permissions', {'fields': ('is_admin',)}),
    )
    # add_fieldsets is not a standard ModelAdmin attribute. UserAdmin
    # overrides get_fieldsets to use this attribute when creating a user.
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('email', 'date_of_birth', 'password1', 'password2')}
        ),
    )
    search_fields = ('email',)
    ordering = ('email',)
    filter_horizontal = ()

# Now register the new UserAdmin...
admin.site.register(MyUser, UserAdmin)
# ... and, since we're not using Django's built-in permissions,
# unregister the Group model from admin.
admin.site.unregister(Group)
 
 
3.3 在settings.py中添加配置:
AUTH_USER_MODEL = 'customauth.MyUser'  #customauth指APP name, MyUser指自定义的用户表model类(这个时候仍然可以使用django.contrib.auth import authenticate,login,logout 等认证方法,只是保存数据的表不一样)


3.4 创建超级用户
  1. 首先我们要新建一个用户名,用来登陆管理网站,可以使用如下命令:

    python manage.py createsuperuser

  2. 输入想要使用的用户名:

    Username (leave blank to use 'administrator'): user01

  3. 输入email:

    Email address: (在这里输入你的自己的邮箱帐号)

  4. 输入密码,需要输入两次,并且输入密码时不会显示出来:

    Password:

    Password (again):

    当两次密码都相同的时候,就会提示超级帐号创建成功。

    Superuser created successfully.

3.5 使用:

用前一步创建的用户,登陆后台管理系统http://0.0.0.0:8081/admin/

django 实现自定义认证的更多相关文章

  1. DRF JWT的用法 & Django的自定义认证类 & DRF 缓存

    JWT 相关信息可参考: https://www.jianshu.com/p/576dbf44b2ae DRF JWT 的使用方法: 1. 安装 DRF JWT # pip install djang ...

  2. django 自定义认证

    在Django中自定义身份验证 Django 自带的认证系统足够应付大多数情况,但你或许不打算使用现成的认证系统.定制自己的项目的权限系统需要了解哪些一些关键点,即Django中哪些部分是能够扩展或替 ...

  3. Django认证系统之自定义认证表

    models.py from django.db import models from django.contrib.auth.models import AbstractUser class Use ...

  4. Django(62)自定义认证类

    前言 如果我们不用使用drf那套认证规则,我们想自定义认证类,那么我们首先要知道,drf本身是如何定义认证规则的,也就是要查看它的源码是如何写的 源码分析 源码的入口在APIView.py文件下的di ...

  5. Django组件之认证系统

      Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Dja ...

  6. django的forms认证组件

    django的forms认证组件 每个网站的注册界面都需要有相应的"认证"功能,比如说认证注册页面的用户名是否已被注册,二次输入的密码是否一致以及认证用户输入的用户名.邮箱.手机号 ...

  7. django之auth认证系统

    Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Djang ...

  8. Django Authentication 用户认证系统

    一. Django的认证系统 Django自带一个用户认证系统,用于处理用户账户.群组.许可和基于cookie的用户会话. 1.1 概览 Django的认证系统包含了身份验证和权限管理两部分.简单地说 ...

  9. Django之用户认证—auth模块

    用户认知———auth模块 目录: auth模块 User对象 实例 扩展默认的auth_user表 - 创建超级用户 - python3 manager.py createsuperuser - 认 ...

随机推荐

  1. 关于<meta http-equiv="Content-Type" content="text/html:charset=UTF-8">

    meta是html的元标签,其中包含了对应html的相关信息,客户端浏览器或服务端程序都会根据这些信息进行处理.我们以<meta http-equiv="Content-Type&qu ...

  2. [洛谷P3865]【模板】ST表

    题目大意:区间静态最大值 题解:ST表,zkw线段树 ST表: st[i][j]存[i,i+$j^{2}$-1]的最大值,查询时把区间分成两个长度相同的小区间(可重复) #include<cst ...

  3. 手动安装GCC

    01sunxiaoqiang的博客 Centos离线手动安装gcc.g++教程 转载 2016-11-06 17:35:18 标签:linux应用笔记 在安装LINUX系统的时候很可能会没有安装gcc ...

  4. JavaScript中Array(数组)的属性和方法(转)

    数组有四种定义的方式 使用构造函数:var a = new Array();var b = new Array(8);var c = new Array("first", &quo ...

  5. domReady的兼容性实现方法

    一.为何要实现domReay方法? 举例: <!DOCTYPE html> <html lang="en"> <head> <meta c ...

  6. javascript实现瀑布流效果(固定宽度)

    HTML代码: <div id="content"> <div class="box"> <div class="img ...

  7. POJ 3070 + 51Nod 1242 大斐波那契数取余

    POJ 3070 #include "iostream" #include "cstdio" using namespace std; class matrix ...

  8. 图论:2-SAT

    先象征性地描述一下问题:一组(或者一个)东西有且仅有两种选择,要么选这个,要么选那个,还有一堆的约束条件 图论问题,当然是建边跑图喽 给出模型: 模型一:两者(A,B)不能同时取 那么选择了A就只能选 ...

  9. MAC电脑密码破解

    [第一个方法] 开机,启动时按cmd+S,进入Single User Mode,出现像DOS一样的提示符#root> 在#root>下输入(注意空格,大小写)   fsck -y moun ...

  10. 【poj3734】矩阵乘法

    题解: 若当前有i个格子.2个是偶数的方案数为a[i]1个是偶数的方案数为b[i]0个是偶数的方案数为c[i] a[i+1]=2*a[i](i+1染成黄或蓝)+b[i](把奇数变为偶数)b[i+1]= ...