在Django中管理Users和Permissions以及Groups的方法
管理认证系统最简单的方法是通过管理界面。然而,当你需要绝对的控制权的时候,有一些低层 API 需要深入专研,我们将在下面的章节中讨论它们。 使用 create_user 辅助函数创建用户: >>> from django.contrib.auth.models import User >>> user = User.objects.create_user(username='john',... email='jlennon@beatles.com',... password='glass onion') 在这里, user 是 User 类的一个实例,准备用于向数据库中存储数据。(create_user()实际上没有调用save())。 create_user() 函数并没有在数据库中创建记录,在保存数据之前,你仍然可以继续修改它的属性值。 >>> user.is_staff = True >>> user.save() 修改密码 你可以使用 set_password() 来修改密码: >>> user = User.objects.get(username='john') >>> user.set_password('goo goo goo joob') >>> user.save() 除非你清楚的知道自己在做什么,否则不要直接修改 password 属性。 其中保存的是密码的 加入salt的hash值 ,所以不能直接编辑。 一般来说, User 对象的 password 属性是一个字符串,格式如下: hashtype$salt$hash 这是哈希类型,salt和哈希本身,用美元符号($)分隔。 hashtype 是 sha1 (默认)或者 md5 ,它是用来处理单向密码哈希的算法。 Salt是一个用来加密原始密码以创建哈希的随机字符串,例如: sha1$a1976$a36cc8cbf81742a8fb52e221aaeab48ed7f58ab4 User.set_password() 和 User.check_password() 函数在后台处理和检查这些值。 salt化得哈希值 一次 哈希 是一次单向的加密过程,你能容易地计算出一个给定值的哈希码,但是几乎不可能从一个哈希码解出它的原值。 如果我们以普通文本存储密码,任何能进入数据库的人都能轻易的获取每个人的密码。 使用哈希方式来存储密码相应的减少了数据库泄露密码的可能。 然而,攻击者仍然可以使用 暴力破解 使用上百万个密码与存储的值对比来获取数据库密码。 这需要花一些时间,但是智能电脑惊人的速度超出了你的想象。 更糟糕的是我们可以公开地得到 rainbow tables (一种暴力密码破解表)或预备有上百万哈希密码值的数据库。 使用rainbow tables可以在几秒之内就能搞定最复杂的一个密码。 在存储的hash值的基础上,加入 salt 值(一个随机值),增加了密码的强度,使得破解更加困难。 因为每个密码的salt值都不相同,这也限制了rainbow table的使用,使得攻击者只能使用最原始的暴力破解方法。 加入salt值得hash并不是绝对安全的存储密码的方法,然而却是安全和方便之间很好的折衷。 我们可以使用这些底层工具来创建允许用户注册的视图。 最近每个开发人员都希望实现各自不同的注册方法,所以Django把写注册视图的工作留给了你。 幸运的是,这很容易。 作为这个事情的最简化处理,我们可以提供一个小视图,提示一些必须的用户信息并创建这些用户。 Django为此提供了可用的内置表单,下面这个例子就使用了这个表单: from django import forms from django.contrib.auth.forms import UserCreationForm from django.http import HttpResponseRedirect from django.shortcuts import render_to_response def register(request): if request.method == 'POST': form = UserCreationForm(request.POST) if form.is_valid(): new_user = form.save() return HttpResponseRedirect("/books/") else: form = UserCreationForm() return render_to_response("registration/register.html",{ 'form': form,}) 这个表单需要一个叫 registration/register.html 的模板。这个模板可能是这样的: {% extends "base.html" %} {% block title %}Create an account{% endblock %} {% block content %} <h1>Create an account</h1> <form action="" method="post"> {{ form.as_p }} <input type="submit" value="Create the account"> </form> {% endblock %}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |