Django—内置用户权限管理

Posted ykgo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django—内置用户权限管理相关的知识,希望对你有一定的参考价值。

内置用户权限管理

对于注册、登录、验证等功能我们可以自己编写用户管理应用,但Django也有一个内置的用户权限管理系统。也是很强大的。

在哪可以看到?

技术分享图片

关于用户的信息都存放在这个表中。

技术分享图片

 

auth模块

from django.contrib import auth

其中有几个常用的方法:

authenticate()

提供了用户认证功能,即验证用户名以及密码是否正确,一般需要username 、password两个关键字参数。

如果认证成功(用户名和密码正确有效),便会返回一个 User 实例对象,否则返回None。

用法:

user = auth.authenticate(username=user, password=pwd)  #进行认证

login(HttpRequest, user)

该函数接受一个HttpRequest对象,以及一个经过认证的User实例对象(也就是 authenticate方法返回的User对象)

该函数实现一个用户登录的功能。会在后端为该用户生成相关session数据

通常 login() 与 authenticate() 一起配合使用。

用法:

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

        # 通过内置验证
        user = auth.authenticate(username=user, password=pwd)

        if user:
            # 将登陆的信息封装到request.user,包括session
            auth.login(request, user)
            return redirect(/index/)

    return render(request, "login.html")

这样我们就可以在其他地方拿到用户相关数据

def index(request):
    name = request.user.username  # 通过user拿到相关信息
    return render(request, index.html, {user: name})

logout(request) 

该函数接受一个HttpRequest对象,无返回值。

当调用该函数时,当前请求的session信息会全部清除。该用户即使没有登录,使用该函数也不会报错。

用法:

def logout(request):
    auth.logout(request)  # 清除当前用户的session信息
    return redirect(/login/)

is_authenticated()

判断用户是否登录,登录返回True,否则返回False。

用法:

def my_view(request):
  if not request.user.is_authenticated():  # 如果登录失败
    return redirect(%s?next=%s % (settings.LOGIN_URL, request.path))

login_requierd()

在执行函数之前先进行登录校检,是一个装饰器

用法:

from django.contrib.auth.decorators import login_required
      
@login_required()   #  如果登录了就执行 index 视图函数
def index(request):
    cd = request.user.username
    return render(request, index.html, {user: cd})

若用户没有登录,则会跳转到django默认的 登录URL ‘/accounts/login/ ‘ 并传递当前访问url的绝对路径 (登陆成功后,会重定向到该路径)。

如果需要自定义登录的URL,则需要在settings.py文件中通过LOGIN_URL进行修改

示例:

LOGIN_URL = /login/  # 这里配置成你项目登录页面的URL

create_user()

auth 提供的一个创建新用户的方法,需要提供必要参数(username、password)等。

用法:

from django.contrib.auth.models import User


def register(request):
    # 内置注册普通 用户
    User.objects.create_user(username=gz, password=123456)
    return HttpResponse("注册成功")

当然我们也可以根据表单结合使用

create_superuser()

auth 提供的一个创建新的超级用户的方法,需要提供必要参数(username、password)等。

用法:

from django.contrib.auth.models import User
user = User.objects.create_superuser(username=用户名,password=密码,email=邮箱,...)

check_password(password)

auth 提供的一个检查密码是否正确的方法,需要提供当前请求用户的密码。

密码正确返回True,否则返回False。

用法:

ok = user.check_password(‘密码‘)

set_password(password)

auth 提供的一个修改密码的方法,接收 要设置的新密码 作为参数。

注意:设置完一定要调用用户对象的save方法!!!

用法:

user.set_password(password=xxxxx)
user.save()  # 不要忘了保存

扩展默认的auth_user表

内置的User表,就那些固定的字段。我想添加自己的字段怎么办?

我们可以通过继承内置的 AbstractUser 类,来定义一个自己的Model类。

from django.contrib.auth.models import User, AbstractUser

# 通过继承  扩展  
class UserInfo(AbstractUser):
    phone = models.IntegerField()
    addr = models.CharField(max_length=30)

注意:

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

# 引用Django自带的User表,继承使用时需要设置
AUTH_USER_MODEL = "app名.UserInfo"

再次注意:

一旦我们指定了新的认证系统所使用的表,我们就需要重新在数据库中创建该表,而不能继续使用原来默认的auth_user表了

 疑问:

如果我们扩展了表之后,那之前的用到内置函数可以用吗?

(1)扩展表之后,表名就是models.py里定义的表名

技术分享图片

技术分享图片

(2)其他关于auth的方法,不影响。

 

以上是关于Django—内置用户权限管理的主要内容,如果未能解决你的问题,请参考以下文章

基于django内置的权限管理系统写一套自己的权限管理

Django REST框架--认证和权限

Django(59)验证和授权

Django 中的功能权限

django基于角色的权限控制

Django内置权限系统源码解读