在Django中管理Users和Permissions以及Groups的方法


Posted in Python onJuly 23, 2015

管理认证系统最简单的方法是通过管理界面。然而,当你需要绝对的控制权的时候,有一些低层 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 %}

Python 相关文章推荐
python实现自动登录人人网并访问最近来访者实例
Sep 26 Python
python实现将pvr格式转换成pvr.ccz的方法
Apr 28 Python
解读Python中degrees()方法的使用
May 18 Python
浅谈python对象数据的读写权限
Sep 12 Python
Python实现模拟登录网易邮箱的方法示例
Jul 05 Python
详解python tkinter教程-事件绑定
Mar 28 Python
Django自定义全局403、404、500错误页面的示例代码
Mar 08 Python
在python中求分布函数相关的包实例
Apr 15 Python
什么是python的id函数
Jun 11 Python
解决pytorch下出现multi-target not supported at的一种可能原因
Feb 06 Python
python模拟浏览器 使用selenium进入好友QQ空间并留言
Apr 12 Python
Python捕获、播放和保存摄像头视频并提高视频清晰度和对比度
Apr 14 Python
Django中对通过测试的用户进行限制访问的方法
Jul 23 #Python
在Django中限制已登录用户的访问的方法
Jul 23 #Python
详解Django框架中用户的登录和退出的实现
Jul 23 #Python
在Django的session中使用User对象的方法
Jul 23 #Python
Django的session中对于用户验证的支持
Jul 23 #Python
在Django的视图(View)外使用Session的方法
Jul 23 #Python
在Python的Django框架的视图中使用Session的方法
Jul 23 #Python
You might like
php数组函数序列之array_pop() - 删除数组中的最后一个元素
2011/11/07 PHP
destoon实现商铺管理主页设置增加新菜单的方法
2014/06/26 PHP
关于扩展 Laravel 默认 Session 中间件导致的 Session 写入失效问题分析
2016/01/08 PHP
PHP实现的AES 128位加密算法示例
2019/09/16 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
2020/03/23 PHP
用javascript实现的仿Flash广告图片轮换效果
2007/04/24 Javascript
解决AJAX中跨域访问出现'没有权限'的错误
2008/08/20 Javascript
用 Javascript 验证表单(form)中的单选(radio)值
2009/09/08 Javascript
js 获取子节点函数 (兼容FF与IE)
2010/04/18 Javascript
移动端jQuery修正Web页面滑动时div问题的两则实例
2016/05/30 Javascript
微信小程序 wxapp内容组件 progress详细介绍
2016/10/31 Javascript
jquery结合html实现中英文页面切换
2016/11/29 Javascript
JS实现的表头列头固定页面功能示例
2017/01/10 Javascript
bootstrap table 数据表格行内修改的实现代码
2017/02/13 Javascript
vue2.x数组劫持原理的实现
2020/04/19 Javascript
[03:55]2014DOTA2国际邀请赛 Fnatic经理采访赢DK在情理之中
2014/07/10 DOTA
python查找指定具有相同内容文件的方法
2015/06/28 Python
简述Python2与Python3的不同点
2018/01/21 Python
Request的中断和ErrorHandler实例解析
2018/02/12 Python
用Python和WordCloud绘制词云的实现方法(内附让字体清晰的秘笈)
2019/01/08 Python
解决webdriver.Chrome()报错:Message:'chromedriver' executable needs to be in Path
2019/06/12 Python
python自动点赞功能的实现思路
2020/02/26 Python
Python使用plt.boxplot() 参数绘制箱线图
2020/06/04 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
2020/09/01 Python
解决margin 外边距合并问题
2019/07/03 HTML / CSS
HTML5实现Notification API桌面通知功能
2016/03/02 HTML / CSS
Javascript如何发送一个Ajax请求
2015/01/26 面试题
单位办理社保介绍信
2014/01/10 职场文书
退休感言
2014/01/28 职场文书
捐款倡议书怎么写
2014/05/13 职场文书
应届毕业生求职信
2014/05/26 职场文书
信访工作汇报材料
2014/10/27 职场文书
旷工检讨书1000字
2015/01/01 职场文书
Mysql基础知识点汇总
2021/05/26 MySQL
java中用float时,数字后面加f,这样是为什么你知道吗
2021/09/04 Java/Android
基于CSS制作创意端午节专属加载特效
2022/06/01 HTML / CSS