Django 用户认证 Auth

一、Django 用户认证(Auth)组件简介

Django 用户认证(Auth)组件一般用在用户的登录注册上,用于判断当前的用户是否合法,并跳转到登陆成功或失败页面。
Django 用户认证(Auth)组件需要导入 auth 模块

https://www.django.cn/article/show-18.html

# 认证模块
from django.contrib import auth

# 对应数据库
from django.contrib.auth.models import User

create():创建一个普通用户,密码是明文的。
create_user():创建一个普通用户,密码是密文的。
create_superuser():创建一个超级用户,密码是密文的,要多传一个邮箱 email 参数。

Auth 权限控制,其实就是对表的增删改查。 权限添加模式:给用户直接设置权限,给组绑定权限。默认在命名规则:权限名-类名

二、User、Group、Permission

User、Group、Permission三个模块及它们之间的关系。
Auth 的三个Model类,6张表 如下图:
django.contrib.auth.models.User
django.contrib.auth.models.Group
django.contrib.auth.models.Permission

auth模块是Django提供的标准权限管理系统,可以提供用户身份认证, 用户组和权限管理。
auth可以和admin模块配合使用, 快速建立网站的管理系统。
在INSTALLED_APPS中添加’django.contrib.auth’使用该APP, auth模块默认启用。
Django用user, group和permission完成了权限机制,这个权限机制是将属于model的某个permission赋予user或group,可以理解为全局的权限。

结合Django自带权限机制和object permission,博客系统中作者的权限控制迎刃而解:系统全局上不允许作者编辑文章,而对于属于作者的具体文章,赋予编辑权限即可。Django其实包含了object permission的框架,但没有具体实现,object permission的实现需要借助第三方app django-guardian,我们在开发中用调用django guradian封装好的方法即可。
在这里插入图片描述

在这里插入图片描述

auth中提供的实用方法:

# authenticate()会在该 User 对象上设置一个属性来标识后端已经认证了该用户,
# 且该信息在后续的登录过程中是需要的。

user = authenticate(username='theuser',password='thepassword')

# login(request,user)该函数接受一个HttpRequest对象,以及一个经过认证的
# User对象。该函数实现一个用户登录的功能。它本质上会在后端为该用户生成相关
# session数据

from django.contrib.auth import authenticate, login
 
def my_view(request):
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(username=username, password=password)
    if user is not None:
        login(request, user)
        # Redirect to a success page.
        ...
    else:
    # Return an 'invalid login' error message.

# logout(request) 该函数接受一个HttpRequest对象,无返回值。当调用该函数
# 时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不
# 会报错。

from django.contrib.auth import logout
 
def logout_view(request):
    logout(request)
    # Redirect to a success page.

# is_authenticated()用来判断当前请求是否通过了认证

def my_view(request):
    if not request.user.is_authenticated():
    return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

# login_requierd()auth 给我们提供的一个装饰器工具,用来快捷的给某个FBV
# 视图添加登录校验。

from django.contrib.auth.decorators import login_required
 
@login_required
def my_view(request):
    ...

从某个页面跳转后的登录页面的url就成了:http://127.0.0.1:8000/login/?next=/page1/

def login(request):

    if request.method == "POST":
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")

        # if 验证成功返回user对象,否则返回None
        user=auth.authenticate(username=user,password=pwd)

        if user:
            auth.login(request,user)   # request.user:当前登录对象

            next_url=request.GET.get("next","/index/")
            return  redirect(next_url)


    return render(request,"login.html"
     

三、 扩展默认的auth_user表

from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
    """
    用户信息表
    """
    nid = models.AutoField(primary_key=True)
    phone = models.CharField(max_length=11, null=True, unique=True)
     
    def __str__(self):
        return self.username

注意:按上面的方式扩展了内置的auth_user表之后,一定要在settings.py中告诉Django,我现在使用我新定义的UserInfo表来做用户认证。写法如下:

AUTH_USER_MODEL = "app名.UserInfo"

或直接修改源码

model.py admin.py 
department = models.CharField(_('部门'), max_length=150, blank=True)

四、 Permisson

Django的auth系统提供了模型级的权限控制, 即可以检查用户是否对某个数据表拥有增(add), 改(change), 删(delete)权限。
auth系统无法提供对象级的权限控制, 即检查用户是否对数据表中某条记录拥有增改删的权限。如果需要对象级权限控制可以使用django-guardian.
假设在博客系统中有一张article数据表管理博文, auth可以检查某个用户是否拥有对所有博文的管理权限, 但无法检查用户对某一篇博文是否拥有管理权限。

添加用户额外权限

# Create your models here.
class Device_Hl(models.Model):
    device_id = models.CharField(verbose_name="设备标识", max_length=20)
    device_name = models.CharField(verbose_name="设备名称", max_length=50)
    device_ip = models.CharField(verbose_name="设备ip", max_length=20)
    mask = models.CharField(verbose_name="子网掩码", max_length=20)
    gate = models.CharField(verbose_name="网关", max_length=20)
    device_top = models.CharField(verbose_name="上联设备", max_length=50)
    region_name = models.CharField(verbose_name="地区", max_length=50)
    remark = models.+(verbose_name="备注", max_length=50)

    class Meta:
        verbose_name = '交换机'
        verbose_name_plural = '交换机'
        permissions = [('codename', 'name')]

自定义权限,在定义Model时可以使用Meta自定义权限:

class Discussion(models.Model):
  ...
  class Meta:
      permissions = (
          ("create_discussion", "Can create a discussion"),
          ("reply_discussion", "Can reply discussion"),
      )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值