Django中的用户认证
Django自带了一个用户授权认证系统。它可以处理用户帐户、组、权限和基于cookie 的用户会话。本篇文档将解释它是如何工作的。
目录
*1概览
*2安装
*3用户(Users)
o3.1API参考
+3.1.1字段
+3.1.2方法
+3.1.3管理功能
o3.2基本用法
+3.2.1创建用户
+3.2.2更改密码
o3.3密码
o3.4匿名用户
o3.5创建超级用户
*4Web请求中的认证
o4.1如何登录一个用户
o4.2如何登出用户
o4.3限制已登录用户的访问
+4.3.1原始的方法
+4.3.2login_required修饰符
o4.4已登录用户通过通行测试(pass test)来限制访问
o4.5限制访问generic views
*5权限(Permissions)
o5.1默认权限
o5.2自定义权限
o5.3API参考
+5.3.1字段
+5.3.2方法
*6模板中的认证数据
o6.1用户(Users)
o6.2权限(Permissions)
*7组(Groups)
*8消息(Messages)
*9其他认证资源
o9.1指定认证后端
o9.2编写一个认证后端
1概览
认证系统包括:
*用户(Users)
*权限(Permissions):二进制(yes/no)的标志,用来指明用户都能做哪些事情。
*组(Groups):向多个用户应用标签和权限的通用方法。
*消息(Messages):为给定的用户排队消息的一个简单的方法。
2安装
认证支持作为Django的一个应用被绑定在ib.auth中。安装方法如下:
1.把'ib.auth'放到你的INSTALLED_APPS设置中。
2.运行命令manage.py syncdb。
注意,默认情况下,通过使用django-admin.py startproject来创建的工程已经在settings.py 中的INSTALLED_APPS包含了'ib.auth'。如果你的INSTALLED_APPS中已经包含了'ib.auth',你也可以再次运行manage.py syncdb。你可以随意运行多少次都无所谓,每一次它都仅仅安装需要的部分。
syncdb创建必要的数据表,同时也为已经安装的apps创建他们需要用到的权限对象。当你第一次运行这个命令的时候,它还会提示你创建一个超级用户的帐户。
django admin 自定义页面当你做完以上这些步骤之后,认证系统就安装好了。
3用户(Users)
用户(Users)表现为一个标准的Django模型,他在django/contrib/auth/models.py中。3.1API参考
3.1.1字段
User对象包含如下字段:
*username--必须。小于等于30个字符。(字母、数字和下划线)
*first_name--可选。小于等于30个字符。
*last_name--可选。小于等于30个字符。
*email--可选。地址。Optional.E-mail address.
*password--必须。密码的hash值。(Django不保存原始密码。)原始密码可以是
任意长的并且可以包含任意字符。请看下面的“密码”节。
*is_staff--布尔型。标识用户能否访问admin界面。
*is_active--布尔型。标识用户能否登录到admin界面。如果不想删除用户请把它设为False
*is_superuser--布尔型。标识用户可以得到所有的权限。
*last_login--用户上一次登录的日期时间。默认设置为当前的日期和时间。
*date_joined--用户帐户创建的日期。默认设置为帐户创建时的日期和时间。3.1.2方法
User对象有2个多对多(many-to-many)的字段:groups和user_permissions。User对象可以像其他Django对象(Django model)那样访问他们关联的对象。
ups=[group_list]
ups.add(group,group,...)
ve(group,group,...)
ups.clear()
myuser.objects.permissions=[permission_list]
myuser.objects.permissions.add(permission,permission,...)
myuser.ve(permission,permission,...]
myuser.objects.permissions.clear()
除了这些自动生成的API方法外,User对象还有如下的自定义的方法:
*is_anonymous()--总是返回False。这是区别User and AnonymousUser对象的一个方法。通常你应该使用is_authenticated()而不是这个方法。
*is_authenticated()--总是返回True。这是测试用户是否被认证了。
*get_full_name()--返回first_name加last_name,中间用空格隔开。
*set_password(raw_password)--用给定的字符串设定用户密码,并且处理密码的hash值。不保存User对象。
*check_password(raw_password)--如果给定的用户密码是正确的,那么返回True。(通过比较密码的hash值来实现的。)
*get_group_permissions()--返回从用户所在的组里面获取的权限列表。
*get_all_permissions()--返回用户拥有的所有的权限。包括组权限和用户权限。
*has_perm(perm)--当参数的格式为"dename"的时候,并且用户拥有特殊权限的时候,返回True。
*has_perms(perm_list)--同上。用户对列表中每一个参数都有特殊权限的时候。每一个参数的格式都是"dename"。
*has_module_perms(package_name)--当用户对给定的包(Django app label)有权限的时候返回True。
*get_and_delete_messages()--返回用户对列中的Message对象列表并且从对列中删除Message对象。
*email_user(subject,message,from_email=None)--向用户发送e-mail。如果
from_email是None,Django使用DEFAULT_FROM_EMAIL设置。
*get_profile()--返回站点特定的用户档案。如果当前站点不允许查询档案的话,Django将抛出dels.SiteProfileNotAvailable异常。
3.1.3管理功能
User模型有一个自定义的管理器,它有如下的函数:
*
create_user(username,email,password)--创建,保存并返回一个User。username,email和password被设置为给定的值,并且User设置了is_active=True。
请看下面的创建用户中的例子。
*
make_random_password(length=10,
allowed_chars='abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789')
返回一个给定长度的并且是包含给定字符的随机密码。(注意:allowed_chars的默认值不包括"I"或者类似的字符,这是为了避免字符分辨不清而产生的抱怨。)
3.2基本用法
3.2.1创建用户
创建用户最基本的方法就是使用Django提供的create_user函数:
>>>dels import User
>>>user=ate_user('john','lennon@thebeatles','johnpassword')
#在这里,User对象已经可以保存到数据库中了。
#你还可以改变它的其它属性。
>>>user.is_staff=True
>>>user.save()
3.2.2更改密码
使用set_password()更改密码:
>>>dels import User
>>>u=(username__exact='john')
>>>u.set_password('new password')
>>>u.save()
除非你很清楚的知道你在做什么,否则不要直接设置password属性。这将在下一节中阐释。
3.3密码
User的password属性是一个如下格式的字符串:
hashtype$salt$hash
它们是hashtype,salt和hash,用一个美元符号来分隔的。
Hashtype是sha1(默认)或md5--单向加密的方法。Salt是一个随机字符串用来为密码的原文创建hash。
例如:
sha1$a1976$a36cc8cbf81742a8fb52e221aaeab48ed7f58ab4
User.set_password()和User.check_password()函数负责处理设置和检测这些密码。
在Django先前的版本中,例如0.90,仅使用MD5而不使用salt。为了向后兼容,这些依然被支持。他们会在第一次使用check_password()来成功检测用户密码的时候自动将其转换为新的格式。
3.4匿名用户
*id总是None.
*is_anonymous()返回True而不是False.
*is_authenticated()返回False而不是True.
*has_perm()总是返回False.
*set_password(),check_password(),save(),delete(),set_groups()and set_permissions()抛出NotImplementedError异常.
在实际应用中,你可能并不需要AnonymousUser对象。但是他们被应用到网络请求(Web request)中,这将在下面的章节中讲述。
3.5创建超级用户

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。