Django学习(五):Auth认证系统

Django认证系统包含:

①用户
②权限:二元(是/否)标志指示一个用户是否可以做一个特定的任务。
③组:对多个用户运用标签和权限的一种通用的方式。
④一个可配置的密码哈希系统
⑤用户登录或内容显示的表单和视图

⑥一个可插拔的后台系统


django.contrib.auth模块中的User模型

字段
username      

必选。 150个字符以内。 可以包含

字母数字,_,@,+ ,. 和-

password 必选。 密码的哈希及元数据。
first_name       可选(blank=True)。 少于等于30个字符。 last_name

可选(blank=True)。 少于等于30个字符。

email 可选(blank=True)。 邮箱地址。 is_active 布尔值。 指示用户的账号是否激活。
last_login 用户最后一次登录的时间。 date_joined

账户创建的时间。 当账号创建时,

默认设置为当前的datetime。

is_staff 布尔值。 指示用户是否可以访问Admin 站点。 is_superuser

布尔值。 指定这个用户拥有所有的权限

而不需要给他们分配明确的权限。

groups 与Group 之间的多对多关系。 user_permissions   与Permission 之间的多对多关系。

属性:

is_authenticated:始终为True(与AnonymousUser.is_authenticated相对,始终为False)的只读属性。 这是区分用户是否已经认证的一种方法


常用方法:

get_username()-->返回这个User 的username

get_full_name()-->返回first_name 和last_name,之间带有一个空格

set_password(raw_password)-->设置用户的密码为给定的原始字符串,并负责密码的哈希。 不会保存User 对象。

check_password(raw_password)-->比较密码的哈希值,一样则返回True

get_group_permissions(obj=None)-->通过用户组返回一个用户当前拥有的权限的set

get_all_permissions(obj=None)-->通过组和用户权限返回用户拥有的一组权限字符串

has_perm(perm, obj=None)-->如果用户具有指定的权限,则返回True;如果用户没有激活,这个方法将永远返回 False

has_perms(perm_list, obj=None)-->如果用户具有指定的每一个权限,则返回True;如果用户没有激活,这个方法将永远返回 False

clean() -->调用normalize_username()来规范用户名。 如果要覆盖此方法,请确保调用super()以保留规范化。


创建user:使用管理器方法

create_user(username, email=None, password=None, **extra_fields)

创建、保存并返回一个User

>>> from django.contrib.auth.models import User

>>> user = User.objects.create_user('john', '[email protected]', 'johnpassword')

create_superuser(username, email, password, **extra_fields)

与create_user() 相同,但是设置is_staff 和is_superuser 为True

也可使用下面命令行的形式创建superuser
>>>python manage.py createsuperuser


认证用户

authenticate(request=None, **credentials)
返回一个User对象 或 None

Django使用会话和中间件来拦截认证系统到请求对象中。
它们在每个请求上提供一个request.user属性,表示当前的用户。 如果当前的用户没有登入,该属性将设置成AnonymousUser的一个实例,否则它将是User的实例。

可以使用  is_authenticated   将它们区分开:

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


登入登出用户

login(request, user, backend=None)

如果你有一个认证了的用户,你想把它附带到当前的会话中 - 这可以通过login()函数完成。

它接受一个HttpRequest对象和一个User对象。 login()使用Django的session框架来将用户的ID保存在session中。请注意,匿名会话期间的任何数据集在用户登录后都会保留在会话中。

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.

get_user(request)-->返回与给定的request会话关联的用户模型实例

request.user -->同上

当渲染RequestContext模板时,当前登录的用户,可能是User实例或者AnonymousUser实例,会存储在模板变量{{ user }}中
当前登录的用户的权限存储在模板变量{{ perms }}中


校验权限装饰器

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

如果用户没有登录,则重定向到settings.LOGIN_URL

2,permission_required(perm, login_url=None, raise_exception=False)
检查一个用户是否有指定的权限的装饰器

//权限名称采用"<app label>.<permission codename>"的形式,(例如polls.can_vote表示polls应用中一个模型的权限)。
from django.contrib.auth.decorators import permission_required

@permission_required('polls.can_vote')
def my_view(request):
    ...
3,user_passes_test(test_func, login_url=None, redirect_field_name='next')

根据某些权限或某些其他测试来限制访问权限

from django.contrib.auth.decorators import user_passes_test

def email_check(user):
    return user.email.endswith('@example.com')

@user_passes_test(email_check)
def my_view(request):
    ...


扩展User模型

1,使用OneToOneField到包含其他信息字段的模型(资料模型 profile model)

class Employee(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    department = models.CharField(max_length=100)
2,通过提供一个值给AUTH_USER_MODEL设置,指向自定义的模型,Django允许你覆盖默认的User模型:

AUTH_USER_MODEL = 'myapp.MyUser'

//继承自AbstractUser,就能继承原User模型的所有字段和方法
from django.contrib.auth.models import AbstractUser
class MyUser(AbstractUser):
    pass


猜你喜欢

转载自blog.csdn.net/hua1011161696/article/details/80931702
今日推荐