Django第十三篇----- Django 中的用户权限管理

目录

概览

使用 Django 的身份验证系统

User 对象

创建超级用户

创建用户

修改密码

 权限和权限核准

 默认权限

 分组

Web 请求中验证身份

扫描二维码关注公众号,回复: 4769860 查看本文章

 Django 如何存储密码


概览

Django 的身份验证系统既能验证身份,也能核准权限。简单来说,身份验证是指确认用户是不是他声称的那个人,而权限核准是指确定通过身份验证的用户能做什么。这里,我们使用“身份验证”指代这两个任务。
Django 的身份验证系统包括:

• 用户
• 权限:二元(是或否)旗标,指明用户是否能执行特定的任务
• 分组:把标注和权限赋予多个用户的通用方式
• 可配置的密码哈希系统
• 管理身份验证和权限核准的表单
• 登录用户或限制内容的视图工具
• 可更换的后端系统

使用 Django 的身份验证系统

Django 的身份验证系统默认实现了多数常见的需求,能处理相当多的任务,而且小心实现了密码和权限。如
果你的项目不想使用默认的实现,Django 也允许对身份验证系统做深入地扩展和定制。

User 对象

User 对象是这个身份验证系统的核心,通常用于标识与网站交互的人,还用于限制访问、记录用户资料,以及把内容与创建人关联起来,等等。在 Django 的身份验证框架中,只有一个用户类存在,因此 superusers或管理后台的 staff 用户只是设定了特殊属性的用户对象,而不是分属不同类的用户对象。默认用户主要有下面几个属性

• username
• password
• email
• first_name
• last_name

创建超级用户

超级用户使用 createsuperuser 命令创建:

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

创建用户

创建和管理用户最简单、最不易出错的方式是使用 Django 管理后台。Django 还内置了登录、退出和修改密码的视图和表单。本章后面会说明如何通过管理后台和普通的表单管理用户,现在先来看如何直接验证用户的身份。

创建用户最直接的方式是使用 create_user() 辅助函数:

>>> from django.contrib.auth.models import User
>>> user = User.objects.create_user('*', '*@*.com', '*')
# 此时,user 是一个 User 对象,而且已经保存到数据库中
# 如果想修改其他字段的值,可以继续修改属性
>>> user.last_name = 'Lennon'
>>> user.save()

修改密码

Django 不在用户模型中存储原始(明文)密码,只存储密码的哈希值。因此,不要试图直接处理用户的密码。正是因为这样,创建密码才要使用一个辅助函数。如果想修改用户的密码,有两个选择:

1. 在命令行中使用 manage.py changepassword username 命令修改用户的密码。这个命令会提示你输入两次密码。如果两次输入的内容匹配,立即修改密码。如果不指定用户名,这个命令会尝试修改与当前系统用户的用户名一致的那个用户的密码。

2. 还可以通过编程方式,使用 set_password() 方法修改:

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

 权限和权限核准

Django 自带了一个简单的权限系统。通过它可以为指定的用户和用户组赋予权限。Django 管理后台就用到了这个系统,当然也欢迎在你自己的代码中使用。Django 管理后台使用权限控制下述操作:

• 限制有某种对象的“添加”权限才能查看“添加”表单和添加对象。
• 限制有某种对象的“修改”权限才能查看修改列表、“修改”表单和修改对象。
• 限制有某种对象的“删除”权限才能删除对象。

 默认权限

在 INSTALLED_APPS 设置中列出 django.contrib.auth 后,安装的各个应用中的每个 Django 模型默认都有三个权限:添加、修改和删除。每次运行 manage.py migrate 命令创建新模型时都会为其赋予这三个权限。

 分组

django.contrib.auth.models.Group 模型是为用户分类的通用方式,这样便可以为一批用户赋予权限或添加其他标注。用户所属的分组数量不限。一个分组中的用户自动获得赋予那个分组的权限。例如“Site editors”分组有 can_edit_home_page 权限,那么其中的任何一个用户都有这个权限

除了权限之外,分组还是为用户分类的便捷方式,分组后可以给用户添加标签,或者扩展功能。例如,可以创建“Special users”分组,然后编写代码,允许这一组中的用户访问只有会员才能查看的内容,或者发送只给会员看的电子邮件。

Web 请求中验证身份

Django 使用会话和中间件把身份验证系统插入 request 对象,为每个请求提供 request.user 属性,表示当前用户。如果未登陆,这个属性的值是一个 AnonymousUser 实例,否则是是一个 User 实例。这两种情况可以使用 is_authenticated() 方法区分,例如:

if request.user.is_authenticated():
# 处理通过身份验证的用户
else:
# 处理匿名用户

 Django 如何存储密码

Django 提供了一个灵活的密码存储系统,默认使用 PBKDF2 算法。 User 对象的 password 属性是这种格式的字符串:

<algorithm>$<iterations>$<salt>$<hash>

这是存储用户密码的各个部分,之间以美元符号分隔。各部分分别是:哈希算法、算法的迭代次数(工作系数)、随机盐值和最终得到的密码哈希值

algorithm 是 Django 支持的某种单向哈希(或称“密码存储”)算法(参见下文)。 iterations 是在哈希值上运用算法的次数。 salt 是使用的随机种子,而 hash 是单向算法得到的结果。Django 默认使用 PBKDF2 算法,得到 SHA256 哈希值。这是 NIST 推荐使用的密码增强机制,对多数用户来说足够了。这种算法相当安全,需要用大量时间计算才能破解。然而,根据具体的需求,你可能想选择其他的算法,甚至自己动手实现一种算法,满足特殊的安全条件。再次说明,多数用户无需这么做。如果你不确定自己该不该这么做,那有可能就不需要。

如果确实需要这么做,请接着读:Django 根据 PASSWORD_HASHERS 设置选择算法。这个设置的值是一个类列表,列出你所安装的 Django 支持的哈希算法。其中第一个元素(即 settings.PASSWORD_HASHERS[0] )用于存储密码,其余的都可用于检查现有密码。

猜你喜欢

转载自blog.csdn.net/Da___Vinci/article/details/84750411