一、简介

Django 身份验证同时提供身份验证和授权,通常称为身份验证系统

二、user对象

User对象是认证系统的核心。代表与站点交互的人,并用于启用诸如限制访问、注册用户配置文件、将内容与创建者关联等。在 Django 的身份验证框架中只存在一类用户,即'superusers'管理员'staff'用户只是具有特殊属性集,而不是不同类别的用户对象。

1、默认用户的主要属性及其他字段

_
@
+
.
-
blank=True
blank=True
blank=True
Group
Permission

2、方法

get_username() 
返回用户的用户名。

get_full_name() 
返回first_name加号last_name,中间有一个空格。

get_short_name() 
返回first_name.

set_password( raw_password ) 
将用户的密码设置为给定的原始字符串,注意密码散列。不保存 User对象。当raw_passwordisNone时,密码将被设置为无法使用的密码,就像 set_unusable_password() 使用过一样。

check_password( raw_password ) 
返回True给定的原始字符串是否是用户的正确密码。

set_unusable_password() 
将用户标记为未设置密码。这与密码的空白字符串不同。 check_password()因为这个用户永远不会回来True。不保存 User对象。

has_usable_password() 
False如果 set_unusable_password()已为此用户调用,则返回。

get_user_permissions( obj =无) 
返回用户直接拥有的一组权限字符串。如果obj传入,则只返回此特定对象的用户权限。

get_group_permissions( obj =无) 
返回用户通过他们的组拥有的一组权限字符串。如果obj传入,则只返回此特定对象的组权限。

get_all_permissions( obj =无) 
通过组和用户权限返回用户拥有的一组权限字符串。如果obj传入,则仅返回此特定对象的权限。

has_perm(perm, obj =无) 
返回True用户是否具有指定的权限,其中 perm 的格式为,如果用户处于非活动状态,此方法将始终返回。对于活动的超级用户,此方法将始终返回."<app label>.<permission codename>"FalseTrue,如果obj传入,则此方法不会检查模型的权限,而是检查此特定对象的权限。

has_perms( perm_list , obj = None ) 
返回True用户是否具有每个指定的权限,其中每个权限的格式为 。如果用户处于非活动状态,此方法将始终返回。对于活动的超级用户,此方法将始终返回."<app label>.<permission codename>"FalseTrue,如果obj传入,则此方法不会检查模型的权限,而是检查特定对象的权限。

has_module_perms(包名) 
True如果用户在给定包(Django 应用标签)中具有任何权限,则返回。如果用户处于非活动状态,此方法将始终返回False。对于活动的超级用户,此方法将始终返回True.

email_user(主题,消息,from_email = None,** kwargs)
向用户发送电子邮件。如果from_email是None,Django 使用DEFAULT_FROM_EMAIL. 任何**kwargs都传递给基础send_mail()调用。

3、创建用户

#创建用户最直接的方法是使用包含的 create_user()辅助函数:
from django.contrib.auth.models import User

user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')
user.last_name = 'Lennon'
user.save()

4、创建超级用户

python manage.py createsuperuser --username=joe --email=joe@example.com

5、修改密码

Django 不在用户模型上存储原始(明文)密码,而仅存储哈希

from django.contrib.auth.models import User
u = User.objects.get(username='john')
u.set_password('new password')
u.save()
#如果您安装了 Django 管理员,可以在身份验证系统的管理页面上更改用户密码。#Django 还提供了视图和表单,可用于允许用户更改自己的密码。

6、验证用户

用于authenticate()验证一组凭据。它将凭据作为关键字参数,username对于 password默认情况,针对每个 身份验证后端User检查它们,如果凭据对后端有效,则返回一个 对象。如果凭据对任何后端都无效,或者后端引发PermissionDenied,则返回None

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

7、权限和授权

Django 带有一个内置的权限系统。它提供了一种将权限分配给特定用户和用户组的方法。

它由 Django 管理站点使用,也可以在自己的代码中使用它。

Django 管理站点使用权限如下

查看对象的访问权限仅限于对该类型对象具有“查看”或“更改”权限的用户。
查看“添加”表单和添加对象的访问权限仅限于对该类型对象具有“添加”权限的用户。
查看更改列表、查看“更改”表单和更改对象的访问权限仅限于对该类型对象具有“更改”权限的用户。
删除对象的权限仅限于对该类型对象具有“删除”权限的用户。

不仅可以按对象类型设置权限,还可以按特定对象实例设置权限。通过使用 类提供的has_view_permission()、 和 方法has_add_permission(), 可以为相同类型的不同对象实例自定义权限。has_change_permission()has_delete_permission()ModelAdmin

User对象有两个多对多字段:groupsuser_permissions. 对象可以像任何其他Django 模型User一样访问它们的相关对象:

myuser.groups.set([group_list])
myuser.groups.add(group, group, ...)
myuser.groups.remove(group, group, ...)
myuser.groups.clear()
myuser.user_permissions.set([permission_list])
myuser.user_permissions.add(permission, permission, ...)
myuser.user_permissions.remove(permission, permission, ...)
myuser.user_permissions.clear()

8、登录

如果您有想要附加到当前会话的经过身份验证的用户 - 这是通过login()函数完成的。

它需要一个HttpRequest对象和一个 User对象。 login()使用 Django 的会话框架将用户的 ID 保存在会话中。

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

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

9、注销用户

要注销已通过 登录的用户, 视图中django.contrib.auth.login()使用 。django.contrib.auth.logout()它接受一个 HttpRequest对象并且没有返回值。例子:

from django.contrib.auth import logout

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

.