Django2.1 用户认证

官方文档

Django认证系统同时处理身份验证和授权。

Django认证系统包含的应用和中间件:

  • 应用
  1. 'django.contrib.auth'  包含认证框架的核心,以及它的默认模型。
  2. 'django.contrib.contenttypes'  是Django内容类型的系统,它允许与您创建的模型相关联。
  • 中间件
  1. SessionMiddleware  管理跨请求的会话。
  2. AuthenticationMiddleware  使用会话将用户与请求关联起来。

创建普通用户

>>> from django.contrib.auth.models import User
>>> user = User.objects.create_user('john', '[email protected]', 'johnpassword')

 创建超级用户

$ python manage.py createsuperuser --username=joe [email protected]

更改密码

>>> from django.contrib.auth.models import User
>>> u = User.objects.get(username='john')
>>> u.set_password('new password')
>>> u.save()

验证用户

authenticate(request=None, **credentials)

from django.contrib.auth import authenticate
user = authenticate(username='john', password='secret')
if user is not None:
    # A backend authenticated the credentials
else:
    # No backend authenticated the credentials

方法有个request的可选参数。

权限和认证

admin管理员的权限:添加、修改、删除。

默认权限

当安装了django.contrib.auth应用,对每个已安装的应用都会有三个默认许可--添加、修改、删除。

当运行manage.py migrate时,管理员对模型的默认权限就会被创建,包括已有的模型和新增的模型。

Web请求的认证

Django使用会话和中间件将认证系统连接到请求对象中。

当用户已经登陆,每个request包含当前用户的用户属性。如果用户没有登陆,这个属性将被设置为一个匿名用户的实例,否则它将成为用户的一个实例。

if request.user.is_authenticated:
    # Do something for authenticated users.
else:
    # Do something for anonymous users.

用户登陆

login(request, user, backend=None)

当使用login方法登陆,user id会被添加到session中。

注意,在用户登录之后,在匿名会话期间的任何数据集都会保留在会话中。

authenticate和login通常配合使用。

from django.contrib.auth import authenticate, login

def my_view(request):
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(request, 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)

注意,如果用户没有登录,logout不会抛出任何错误。

from django.contrib.auth import logout

def logout_view(request):
    logout(request)
    # Redirect to a success page.

当调用logout,当前请求的session数据会被完全清除,这是为了防止另一个人使用相同的Web浏览器登录并访问前一个用户的会话数据,如果你想往session中添加数据,在调用logout之后再操作。

login_required 装饰器

login_required(redirect_field_name='next', login_url=None)

在django中REDIRECT_FIELD_NAME的默认值是‘next’。

from django.contrib.auth.decorators import login_required

@login_required(login_url='/accounts/login/')
def my_view(request):
    ...

作用:如果用户未登陆,可以重定向到login url,如果已经登陆,视图代码可以自由地假设用户已经登陆。

当使用基于类的视图时,使用LoginRequiredMixin具有跟login_required装饰器同样的作用。

from django.contrib.auth.mixins import LoginRequiredMixin

class MyView(LoginRequiredMixin, View):
    login_url = '/login/'
    redirect_field_name = 'redirect_to'

 

你可能感兴趣的:(Django2.1 用户认证)