当前位置:   article > 正文

Django 用户认证 Auth_django用户认证auth

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 参数。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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):
    ...

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

从某个页面跳转后的登录页面的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"
     
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

三、 扩展默认的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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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

AUTH_USER_MODEL = "app名.UserInfo"
  • 1

或直接修改源码

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

四、 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')]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

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

class Discussion(models.Model):
  ...
  class Meta:
      permissions = (
          ("create_discussion", "Can create a discussion"),
          ("reply_discussion", "Can reply discussion"),
      )
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/71681
推荐阅读
相关标签
  

闽ICP备14008679号