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

作者:yoyo008 时间:2021-02-03 07:54:38 

自定义用户认证系统

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/

来源:https://www.cnblogs.com/yoyo008/p/12777787.html

标签:Django,用户,认证,系统
0
投稿

猜你喜欢

  • Python文件读写保存操作的示例代码

    2022-03-20 01:21:23
  • 修改Python的pyxmpp2中的主循环使其提高性能

    2022-07-22 15:26:53
  • redux-saga 初识和使用

    2023-07-15 16:20:17
  • Bootstrap风格的WPF样式

    2024-05-02 17:32:17
  • python皮尔逊相关性数据分析分析及实例代码

    2021-03-12 13:23:34
  • Python中import语句用法案例讲解

    2023-08-07 05:33:47
  • Python函数式编程指南(一):函数式编程概述

    2023-07-08 01:20:25
  • python脚本之一键移动自定格式文件方法实例

    2021-08-13 09:41:55
  • Python二维列表的创建、转换以及访问详解

    2022-08-09 16:03:15
  • 微信小程序中的canvas 文字断行和省略号显示功能的处理方法

    2023-08-25 02:53:35
  • Mysql使用Describe命令判断字段是否存在

    2011-04-25 18:27:00
  • Vue3 计算属性的用法详解

    2024-04-28 09:20:33
  • JS前端接口请求参数混淆方案分享

    2024-04-18 10:53:17
  • SQL 2005 sa islock用户不能正常登录的现象

    2008-12-05 15:49:00
  • Python实现各种邮件发送

    2021-09-01 17:35:47
  • python实现RSA加密(解密)算法

    2023-04-20 06:12:15
  • python如何实现质数求和

    2023-03-02 20:17:24
  • Python之OptionParser模块使用详解

    2021-03-08 14:07:48
  • Python利用DNN实现宝石识别

    2023-08-07 05:49:18
  • sqlserver 修改列名及表名的sql语句

    2012-07-11 15:58:46
  • asp之家 网络编程 m.aspxhome.com