Go最新Django11—授权和验证_django 授权(2),系统盘点Golang开发者必须掌握的知识点

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!


后面就会提示你输入用户名、邮箱以及密码。


#### 修改密码


因为密码是需要经过加密后才能存储进去的。所以如果想要修改密码,不能直接修改password字段,而需要通过调用set\_password来达到修改密码的目的。示例代码如下:



from django.contrib.auth.models import User
user = User.objects.get(pk=1)
user.set_password(‘新的密码’)
user.save()


#### 登录验证


Django的验证系统已经帮我们实现了登录验证的功能。通过`django.contrib.auth.authenticate`即可实现。这个方法只能通过username和password来进行验证。示例代码如下:



from django.contrib.auth import authenticate
user = authenticate(username=‘zhiliao’, password=‘111111’)

如果验证通过了,那么就会返回一个user对象。

if user is not None:
# 执行验证通过后的代码
else:
# 执行验证没有通过的代码。


### 扩展用户模型


Django内置的User模型虽然已经足够强大了。但是有时候还是不能满足我们的需求。比如在验证用户登录的时候,他用的是用户名作为验证,而我们有时候需要通过手机号码或者邮箱来进行验证。还有比如我们想要增加一些新的字段。那么这时候我们就需要扩展用户模型了。扩展用户模型有多种方式。这里我们来一一讨论下。


#### 设置proxy模型


如果你对Django提供的字段,以及验证的方法都比较满意,没有什么需要改的。但是只是需要在他原有的基础之上增加一些操作的方法。那么建议使用这种方式。示例代码如下:



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。示例代码如下:**



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)

**在创建了新的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)

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

09814)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值