django 实现自定义认证

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自带用户认证系统,用户数据存在自己定义的表
from django.contrib.auth.models import User
class 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 在settings.py中添加配置:
AUTH_USER_MODEL = 'customauth.MyUser'  #customauth指APP name, MyUser指自定义的用户表model类


3.3 创建超级用户
  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.4 使用:

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


猜你喜欢

转载自www.cnblogs.com/yoyo008/p/9158995.html
今日推荐