在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的字典和列表的使用中一些需要注意的地方
Apr 24 Python
python实现搜索指定目录下文件及文件内搜索指定关键词的方法
Jun 28 Python
Python 中pandas.read_excel详细介绍
Jun 23 Python
pycharm重置设置,恢复默认设置的方法
Oct 22 Python
python3实现小球转动抽奖小游戏
Apr 15 Python
python openpyxl使用方法详解
Jul 18 Python
详解Python并发编程之从性能角度来初探并发编程
Aug 23 Python
Python生成验证码、计算具体日期是一年中的第几天实例代码详解
Oct 16 Python
Pandas之read_csv()读取文件跳过报错行的解决
Apr 21 Python
python实现文法左递归的消除方法
May 22 Python
django上传文件的三种方式
Apr 29 Python
Python+Pillow+Pytesseract实现验证码识别
May 11 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下MAIL的另一解决方案
2006/10/09 PHP
PHP目录操作实例总结
2016/09/27 PHP
php foreach如何跳出两层循环(详解)
2016/11/05 PHP
PHP+MYSQL实现读写分离简单实战
2017/03/13 PHP
PHP重置数组为连续数字索引的几种方式总结
2018/03/12 PHP
js检测客户端不是firefox则提示下载
2007/04/07 Javascript
javascript 获取select下拉列表值的代码
2009/09/07 Javascript
ko knockoutjs动态属性绑定技巧应用
2012/11/14 Javascript
instanceof和typeof运算符的区别详解
2014/01/06 Javascript
js拼接html注意问题示例探讨
2014/07/14 Javascript
javascript中的正则表达式使用指南
2015/03/01 Javascript
jQuery的animate函数实现图文切换动画效果
2015/05/03 Javascript
JS通过Cookie判断页面是否为首次打开
2016/02/05 Javascript
详解html-webpack-plugin用法全解
2018/01/22 Javascript
vue 实现微信浮标效果
2019/09/01 Javascript
JavaScript自动生成 年月范围 选择功能完整示例【基于jQuery插件】
2019/09/03 jQuery
微信小程序实现弹框效果
2020/05/26 Javascript
JS时间戳与日期格式互相转换的简单方法示例
2021/01/30 Javascript
python2与python3的print及字符串格式化小结
2018/11/30 Python
使用selenium模拟登录解决滑块验证问题的实现
2019/05/10 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
2019/05/27 Python
python与C、C++混编的四种方式(小结)
2019/07/15 Python
Python实现串口通信(pyserial)过程解析
2019/09/25 Python
python实现滑雪者小游戏
2020/02/22 Python
Python tkinter布局与按钮间距设置方式
2020/03/04 Python
将python字符串转化成长表达式的函数eval实例
2020/05/11 Python
10个示例带你掌握python中的元组
2020/11/23 Python
python 如何用urllib与服务端交互(发送和接收数据)
2021/03/04 Python
怎样从/向数据文件读/写结构
2014/11/23 面试题
房地产推广策划方案
2014/05/19 职场文书
“向国旗敬礼”主题班会活动设计方案
2014/09/27 职场文书
校本培训个人总结
2015/02/28 职场文书
2015年科普工作总结
2015/07/23 职场文书
银行岗位培训心得体会
2016/01/09 职场文书
Django 实现jwt认证的示例
2021/04/30 Python
Vue组件化(ref,props, mixin,.插件)详解
2022/05/15 Vue.js