在Django中管理Users和Permissions以及Groups的方法
管理認(rèn)證系統(tǒng)最簡單的方法是通過管理界面。然而,當(dāng)你需要絕對(duì)的控制權(quán)的時(shí)候,有一些低層 API 需要深入專研,我們將在下面的章節(jié)中討論它們。
創(chuàng)建用戶
使用 create_user 輔助函數(shù)創(chuàng)建用戶:
>>> from django.contrib.auth.models import User >>> user = User.objects.create_user(username='john', ... email='jlennon@beatles.com', ... password='glass onion')
在這里, user 是 User 類的一個(gè)實(shí)例,準(zhǔn)備用于向數(shù)據(jù)庫中存儲(chǔ)數(shù)據(jù)。(create_user()實(shí)際上沒有調(diào)用save())。 create_user() 函數(shù)并沒有在數(shù)據(jù)庫中創(chuàng)建記錄,在保存數(shù)據(jù)之前,你仍然可以繼續(xù)修改它的屬性值。
>>> 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 對(duì)象的 password 屬性是一個(gè)字符串,格式如下:
hashtype$salt$hash
這是哈希類型,salt和哈希本身,用美元符號(hào)($)分隔。
hashtype 是 sha1 (默認(rèn))或者 md5 ,它是用來處理單向密碼哈希的算法。 Salt是一個(gè)用來加密原始密碼以創(chuàng)建哈希的隨機(jī)字符串,例如:
sha1$a1976$a36cc8cbf81742a8fb52e221aaeab48ed7f58ab4
User.set_password() 和 User.check_password() 函數(shù)在后臺(tái)處理和檢查這些值。
salt化得哈希值
一次 哈希 是一次單向的加密過程,你能容易地計(jì)算出一個(gè)給定值的哈希碼,但是幾乎不可能從一個(gè)哈希碼解出它的原值。
如果我們以普通文本存儲(chǔ)密碼,任何能進(jìn)入數(shù)據(jù)庫的人都能輕易的獲取每個(gè)人的密碼。 使用哈希方式來存儲(chǔ)密碼相應(yīng)的減少了數(shù)據(jù)庫泄露密碼的可能。
然而,攻擊者仍然可以使用 暴力破解 使用上百萬個(gè)密碼與存儲(chǔ)的值對(duì)比來獲取數(shù)據(jù)庫密碼。 這需要花一些時(shí)間,但是智能電腦驚人的速度超出了你的想象。
更糟糕的是我們可以公開地得到 rainbow tables (一種暴力密碼破解表)或預(yù)備有上百萬哈希密碼值的數(shù)據(jù)庫。 使用rainbow tables可以在幾秒之內(nèi)就能搞定最復(fù)雜的一個(gè)密碼。
在存儲(chǔ)的hash值的基礎(chǔ)上,加入 salt 值(一個(gè)隨機(jī)值),增加了密碼的強(qiáng)度,使得破解更加困難。 因?yàn)槊總€(gè)密碼的salt值都不相同,這也限制了rainbow table的使用,使得攻擊者只能使用最原始的暴力破解方法。
加入salt值得hash并不是絕對(duì)安全的存儲(chǔ)密碼的方法,然而卻是安全和方便之間很好的折衷。
處理注冊(cè)
我們可以使用這些底層工具來創(chuàng)建允許用戶注冊(cè)的視圖。 最近每個(gè)開發(fā)人員都希望實(shí)現(xiàn)各自不同的注冊(cè)方法,所以Django把寫注冊(cè)視圖的工作留給了你。 幸運(yùn)的是,這很容易。
作為這個(gè)事情的最簡化處理, 我們可以提供一個(gè)小視圖, 提示一些必須的用戶信息并創(chuàng)建這些用戶。 Django為此提供了可用的內(nèi)置表單, 下面這個(gè)例子就使用了這個(gè)表單:
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, })
這個(gè)表單需要一個(gè)叫 registration/register.html 的模板。這個(gè)模板可能是這樣的:
{% 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 %}
相關(guān)文章
python里的單引號(hào)和雙引號(hào)的有什么作用
在本篇文章里小編給大家分享的是一篇關(guān)于python里的單引號(hào)和雙引號(hào)的作用的相關(guān)內(nèi)容,需要的朋友們可以學(xué)習(xí)下。2020-06-06淺談django的render函數(shù)的參數(shù)問題
今天小編就為大家分享一篇淺談django的render函數(shù)的參數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-10-10PyTorch 導(dǎo)數(shù)應(yīng)用的使用教程
這篇文章主要介紹了PyTorch 導(dǎo)數(shù)應(yīng)用的使用教程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08python 數(shù)據(jù)類(dataclass)的具體使用
本文主要介紹了python 數(shù)據(jù)類(dataclass)的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03Python深度學(xué)習(xí)理解pytorch神經(jīng)網(wǎng)絡(luò)批量歸一化
這篇文章主要是Python深度學(xué)習(xí)篇,通過示例的詳解讓大家更好的理解pytorch神經(jīng)網(wǎng)絡(luò)批量歸一化,有需要的的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10python多進(jìn)程執(zhí)行方法apply_async使用說明
這篇文章主要介紹了python多進(jìn)程執(zhí)行方法apply_async使用說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-03-03