Django认证系统包含:
①用户
②权限:二元(是/否)标志指示一个用户是否可以做一个特定的任务。
③组:对多个用户运用标签和权限的一种通用的方式。
④一个可配置的密码哈希系统
⑤用户登录或内容显示的表单和视图
⑥一个可插拔的后台系统
username | 必选。 150个字符以内。 可以包含 字母数字,_,@,+ ,. 和- |
password | 必选。 密码的哈希及元数据。 |
first_name | 可选(blank=True)。 少于等于30个字符。 | last_name | 可选(blank=True)。 少于等于30个字符。 |
可选(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()以保留规范化。
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)
检查一个用户是否有指定的权限的装饰器
//权限名称采用"."的形式,(例如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):
...
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