Django用户认证系统如何实现自定义


Posted in Python onNovember 12, 2020

自定义用户认证系统

Django 自带的用户认证系统已经可以满足大部分的情况,但是有时候我们需要某些特定的需求。Django 支持使用其他认证系统、也可以扩展Django的User模块,完全自定义新的认证模块。

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

a、拷贝以下代码到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等字段都是可以自定义的

b、在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)

C、 在settings.py中添加配置:

AUTH_USER_MODEL = 'customauth.MyUser' #customauth指APP name, MyUser指自定义的用户表model类
(这个时候仍然可以使用django.contrib.auth import authenticate,login,logout 等认证方法,只是保存数据的表不一样)

D、创建超级用户

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

python manage.py createsuperuser

输入想要使用的用户名:

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

输入email:

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

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

Password:

Password (again):

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

Superuser created successfully.

E、使用:

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python Mysql数据库操作 Perl操作Mysql数据库
Jan 12 Python
Python判断值是否在list或set中的性能对比分析
Apr 16 Python
Python可变参数用法实例分析
Apr 02 Python
Python基于pygame模块播放MP3的方法示例
Sep 30 Python
python实现微信接口(itchat)详细介绍
Oct 23 Python
python绘制简单折线图代码示例
Dec 19 Python
对Tensorflow中tensorboard日志的生成与显示详解
Feb 04 Python
python不相等的两个字符串的 if 条件判断为True详解
Mar 12 Python
python 错误处理 assert详解
Apr 20 Python
Python list和str互转的实现示例
Nov 16 Python
使用PyCharm官方中文语言包汉化PyCharm
Nov 18 Python
python3实现飞机大战
Nov 29 Python
Django自带用户认证系统使用方法解析
Nov 12 #Python
Django多数据库联用实现方法解析
Nov 12 #Python
Django数据库迁移常见使用方法
Nov 12 #Python
python爬虫中PhantomJS加载页面的实例方法
Nov 12 #Python
python调用win32接口进行截图的示例
Nov 11 #Python
python 下载m3u8视频的示例代码
Nov 11 #Python
pytorch简介
Nov 11 #Python
You might like
使用cookie实现统计访问者登陆次数
2013/06/08 PHP
免费手机号码归属地API查询接口和PHP使用实例分享
2014/04/10 PHP
PHP统计目录中文件以及目录中目录大小的方法
2016/01/09 PHP
PHP htmlspecialchars() 函数实例代码及用法大全
2018/09/18 PHP
js function定义函数使用心得
2010/04/15 Javascript
js的匿名函数使用介绍
2013/12/11 Javascript
jquery的ajax跨域请求原理和示例
2014/05/08 Javascript
JavaScript利用正则表达式去除日期中的-
2014/06/09 Javascript
jquery使用ul模拟select实现表单美化的方法
2015/08/18 Javascript
javascript中加var和不加var的区别 你真的懂吗
2016/01/06 Javascript
简介AngularJS中$http服务的用法
2016/02/06 Javascript
JS上传图片预览插件制作(兼容到IE6)
2016/08/07 Javascript
JavaScript面向对象分层思维全面解析
2016/11/22 Javascript
详解Angularjs在控制器(controller.js)中使用过滤器($filter)格式化日期/时间实例
2017/02/17 Javascript
Vue中$refs的用法详解
2018/06/24 Javascript
js自定义input文件上传样式
2018/10/26 Javascript
使用NestJS开发Node.js应用的方法
2018/12/03 Javascript
微信小程序实现手势滑动卡片效果
2019/08/26 Javascript
解决vue watch数据的方法被调用了两次的问题
2020/11/07 Javascript
在Python中使用pngquant压缩png图片的教程
2015/04/09 Python
Python用imghdr模块识别图片格式实例解析
2018/01/11 Python
50行Python代码实现人脸检测功能
2018/01/23 Python
浅谈Python小波分析库Pywavelets的一点使用心得
2019/07/09 Python
Corelle官方网站:购买康宁餐具
2016/11/02 全球购物
特罗佩亚包官方网站:Tropea
2017/01/03 全球购物
销售找工作求职信
2013/12/20 职场文书
大学生职业生涯规划范文——找准自我,定位人生
2014/01/23 职场文书
硕士研究生求职自荐信范文
2014/03/11 职场文书
市场调研项目授权委托书范本
2014/10/04 职场文书
综治目标管理责任书
2015/05/11 职场文书
公司宣传语大全
2015/07/13 职场文书
大学自主招生自荐信(2016精选篇)
2016/01/28 职场文书
详解Vue项目的打包方式(生成dist文件)
2022/01/18 Vue.js
分享提高 Python 代码的可读性的技巧
2022/03/03 Python
Golang使用Panic与Recover进行错误捕获
2022/03/22 Golang
git stash(储藏)的用法总结
2022/06/25 Servers