django扩展User认证系统
第一种方法proxy
如果你对Django
提供的字段,以及验证的方法都比较满意,没有什么需要改的。但是只是需要在他原有的基础之上增加一些操作的方法。那么建议使用这种方式。示例代码如下:
#在model.py下
class Person(User):
class Meta:
proxy = True def get_blacklist(self):
return self.objects.filter(is_active=False)
在以上,我们定义了一个Person
类,让他继承自User
,并且在Meta
中设置proxy=True
,说明这个只是User
的一个代理模型。他并不会影响原来User
模型在数据库中表的结构。以后如果你想方便的获取所有黑名单的人,那么你就可以通过Person.get_blacklist()
就可以获取到。并且User.objects.all()
和Person.objects.all()
其实是等价的。因为他们都是从User
这个模型中获取所有的数据。
第二种一对一外键
如果你对用户验证方法authenticate
没有其他要求,就是使用username
和password
即可完成。但是想要在原来模型的基础之上添加新的字段,那么可以使用一对一外键的方式。示例代码如下:
from django.contrib.auth.models import User
from django.db import models
from django.dispatch import receiver
from django.db.models.signals import post_save class UserExtension(models.Model):
user = models.OneToOneField(User,on_delete=models.CASCADE,related_name='extension')
birthday = models.DateField(null=True,blank=True)
school = models.CharField(max_length=100) @receiver(post_save,sender=User)
def create_user_extension(sender,instance,created,**kwargs):
if created:
UserExtension.objects.create(user=instance)
else:
instance.extension.save()
以上定义一个UserExtension
的模型,并且让她和User
模型进行一对一的绑定,以后我们新增的字段,就添加到UserExtension
上。并且还写了一个接受保存模型的信号处理方法,只要是User
调用了save
方法,那么就会创建一个UserExtension
和User
进行绑定。
第三种继承自AbstractUser
:
对于authenticate
不满意,并且不想要修改原来User
对象上的一些字段,但是想要增加一些字段,那么这时候可以直接继承自django.contrib.auth.models.AbstractUser
,其实这个类也是django.contrib.auth.models.User
的父类。比如我们想要在原来User
模型的基础之上添加一个telephone
和school
字段。示例代码如下:
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
telephone = models.CharField(max_length=11,unique=True)
school = models.CharField(max_length=100) # 指定telephone作为USERNAME_FIELD,以后使用authenticate
# 函数验证的时候,就可以根据telephone来验证
# 而不是原来的username
USERNAME_FIELD = 'telephone'
REQUIRED_FIELDS = [] # 重新定义Manager对象,在创建user的时候使用telephone和
# password,而不是使用username和password
objects = UserManager() class UserManager(BaseUserManager):
use_in_migrations = True def _create_user(self,telephone,password,**extra_fields):
if not telephone:
raise ValueError("请填入手机号码!")
user = self.model(telephone=telephone,*extra_fields)
user.set_password(password)
user.save()
return user def create_user(self,telephone,password,**extra_fields):
extra_fields.setdefault('is_superuser',False)
return self._create_user(telephone,password) def create_superuser(self,telephone,password,**extra_fields):
extra_fields['is_superuser'] = True
return self._create_user(telephone,password)
然后再在settings
中配置好AUTH_USER_MODEL=youapp.User
。
这种方式因为破坏了原来User模型的表结构,所以必须要在第一次migrate
前就先定义好。
第四种继承自AbstractBaseUser
模型:
如果你想修改默认的验证方式,并且对于原来User
模型上的一些字段不想要,那么可以自定义一个模型,然后继承自AbstractBaseUser
,再添加你想要的字段。这种方式会比较麻烦,最好是确定自己对Django
比较了解才推荐使用。步骤如下:
创建模型。示例代码如下:
class User(AbstractBaseUser,PermissionsMixin):
email = models.EmailField(unique=True)
username = models.CharField(max_length=150)
telephone = models.CharField(max_length=11,unique=True)
is_active = models.BooleanField(default=True) USERNAME_FIELD = 'telephone'
REQUIRED_FIELDS = [] objects = UserManager() def get_full_name(self):
return self.username def get_short_name(self):
return self.username
其中password
和last_login
是在AbstractBaseUser
中已经添加好了的,我们直接继承就可以了。然后我们再添加我们想要的字段。比如email
、username
、telephone
等。这样就可以实现自己想要的字段了。但是因为我们重写了User
,所以应该尽可能的模拟User
模型:
USERNAME_FIELD
:用来描述User
模型名字字段的字符串,作为唯一的标识。如果没有修改,那么会使用USERNAME
来作为唯一字段。REQUIRED_FIELDS
:一个字段名列表,用于当通过createsuperuser
管理命令创建一个用户时的提示。is_active
:一个布尔值,用于标识用户当前是否可用。get_full_name()
:获取完整的名字。get_short_name()
:一个比较简短的用户名。
重新定义
UserManager
:我们还需要定义自己的UserManager
,因为默认的UserManager
在创建用户的时候使用的是username
和password
,那么我们要替换成telephone
。示例代码如下:
from django.db import models
from django.contrib.auth.base_user import AbstractBaseUser
from django.contrib.auth.models import PermissionsMixin
from django.contrib.auth.models import AbstractUser,BaseUserManager class UserManager(BaseUserManager):
def _create_user(self,telephone,username,password, **kwargs):
if not telephone:
raise ValueError('请输入手机号码!')
if not password:
raise ValueError('请输入密码!')
user = self.model(telephone=telephone,username=username,**kwargs)
user.set_password(password)
user.save()
return user
def create_user(self,telephone,username,password,**kwargs):
return self._create_user(telephone=telephone,username=username,password=password,is_superuser=False)
def create_superuser(self,telephone,username,password,**kwargs):
return self._create_user(telephone=telephone,username=username,password=password,is_superuser=True)
在创建了新的
User
模型后,还需要在settings
中配置好。配置AUTH_USER_MODEL='appname.User'
。如何使用这个自定义的模型:比如以后我们有一个
Article
模型,需要通过外键引用这个User
模型,那么可以通过以下两种方式引用。
第一种就是直接将User
导入到当前文件中。示例代码如下:
from django.db import models
from myauth.models import User
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
author = models.ForeignKey(User, on_delete=models.CASCADE)
这种方式是可以行得通的。但是为了更好的使用性,建议还是将User
抽象出来,使用settings.AUTH_USER_MODEL
来表示。示例代码如下:
from django.db import models
from django.conf import settings
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
这种方式因为破坏了原来User模型的表结构,所以必须要在第一次migrate
前就先定义好。
django扩展User认证系统的更多相关文章
- Django组件之认证系统
Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Dja ...
- django之auth认证系统
Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Djang ...
- django自定义user认证系统
第一种,彻底推翻django的user认证系统,重新定义我们想要的字段 from django.contrib.auth.models import AbstractBaseUser,Permissi ...
- Laravel核心解读 -- 扩展用户认证系统
扩展用户认证系统 上一节我们介绍了Laravel Auth系统实现的一些细节知道了Laravel是如何应用看守器和用户提供器来进行用户认证的,但是针对我们自己开发的项目或多或少地我们都会需要在自带的看 ...
- 将Python的Django框架与认证系统整合的方法
将Python的Django框架与认证系统整合的方法 这篇文章主要介绍了将Python的Django框架与认证系统整合的方法,包括指定认证后台和编写认证后台等内容,需要的朋友可以参考下 将Django ...
- django(权限、认证)系统—— 基于Authentication backends定制
在这篇文章中,我们进行最后关于DjangoPermission系统的探讨,来谈谈关于Permission系统后台接口和扩展后台接口的开发. Django实现的这套permission体系,在底层被抽象 ...
- Django自定义用户认证系统之自定义用户模型
参考文档:http://python.usyiyi.cn/django/topics/auth/customizing.html Django 自带的认证系统足够应付大多数情况,但你或许不打算使用现成 ...
- django(权限、认证)系统——自定义UserProfile储存User额外信息
上篇文章我们引出了Django内置的权限控制系统,讲了安装,和最核心和基本的User模型的API和其Manager的API. 接下来我们继续深入下去,使用User对象做一些事情,首先当然就是创建一个U ...
- Django Authentication 用户认证系统
一. Django的认证系统 Django自带一个用户认证系统,用于处理用户账户.群组.许可和基于cookie的用户会话. 1.1 概览 Django的认证系统包含了身份验证和权限管理两部分.简单地说 ...
随机推荐
- django之normalize函数的功能
from django.utils.regex_helper import normalize pat=r'^(?P<id>\d+)/(?P<name>\d+)$' bits= ...
- leetcode10
class Solution { public boolean isMatch(String s, String p) { if (s == null || p == null) { return f ...
- 尚硅谷springboot学习28-Docker简介
Docker是一个开源的应用容器引擎:是一个轻量级容器技术: Docker支持将软件编译成一个镜像:然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像: 运行中的这个镜像称为 ...
- ELK收集Nginx|Tomcat日志
1.Nginx 日志收集,先安装Nginx cd /usr/local/logstash/config/etc/,创建如下配置文件,代码如下 Nginx.conf input { file { typ ...
- win10 下安装 neo4j(转)
1.neo4j介绍 neo4j是基于Java语言编写图形数据库.图是一组节点和连接这些节点的关系.图形数据库也被称为图形数据库管理系统或GDBMS.详细介绍可看Neo4j 教程 2.安装Java jd ...
- Add Inline Actions
[Add Inline Actions] 1.为了使用 inline action,需要给 eosio.code 账号添加active权限. To use the 'activeauthority i ...
- Windows 10同步时间的方法
今天在安装了Windows 10 1809(October 2018 update)之后发现时间不能同步,以前并没有出现这种情况. 1) 打开控制面板,找到时钟域地区 2) 选择日期和时间 3) 选择 ...
- php RSA非对称加密 的实现
基本概念 加密的意义 加密的意义在于数据的传输过程中,即使被第三方获取到传输的数据,第三方也不能获取到数据的具体含义. 加密方式分为对称加密和非对称加密 什么是对称加密? 对称加密只使用一个秘钥,加密 ...
- Zabbix安装部署(CentOS系统下)
zabbix(音同 zæbix)是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让系统 ...
- 可视化-echarts流向图制作
案例: http://www.internetke.com/jsEffects/2018040406/ 前段时间用echarts做了流程图,在此记录下制作步骤. 一.Echarts是什么 Echart ...