Django-Auth認證系統(tǒng)

我們在開發(fā)一個網(wǎng)站的時候施蜜,我可避免的需要設(shè)計實現(xiàn)網(wǎng)站的用戶系統(tǒng)雌隅。此時我們需要實現(xiàn)包括用戶注冊恰起、用戶登錄、用戶認證检盼、注銷肯污、修改密碼等一系列功能。Django作為一個完美主義者的終極框架吨枉,當然也會想到用戶的這些需求蹦渣,它內(nèi)置了強大的用戶認證系統(tǒng)——auth,他默認使用auth_user 表來存儲用戶數(shù)據(jù)貌亭。

新建用戶

創(chuàng)建用戶最直接的方法是使用包含 create_user() 的函數(shù):

from django.contrib.auth.models import User    #引入User模塊

user = User.objects.create_user(username=username, password=password)    #新建普通用戶
user = User.objects.create_superuser(username=username, password=password)    #創(chuàng)建超級用戶
user.sava()    #創(chuàng)建用戶并提交

認證用戶

使用 authenticate() 來驗證用戶柬唯。它使用 usernamepassword 作為參數(shù)來驗證,對每個身份驗證后端進行檢查属提。如果后端驗證有效权逗,則返回一個User對象冤议,否則將返回 None斟薇。

from django.contrib.auth import authenticate    #引入authenticate模塊

user = authenticate(username='username', password='password')
if user is not None:
    # A backend authenticated the credentials
else:
    # No backend authenticated the credentials
# 認證用戶的賬戶密碼是否有效, 若有效則返回代表該用戶的user對象, 若無效則返回None.

修改密碼和密碼驗證

Django 不會在用戶模型里保存原始(明文)密碼,而只會存儲哈希值 恕酸。因此堪滨,請不要試圖直接操作用戶的密碼,這就是創(chuàng)建用戶需要輔助函數(shù)的原因蕊温。

from django.contrib.auth.models import User

user = User.objects.get(username='username')
user.set_password('new password')
user.save()

check_password(raw_password)
auth 提供的一個檢查密碼是否正確的方法袱箱,需要提供當前請求用戶的密碼。密碼爭取返回True义矛,否則返回Fale发笔。
一個修改密碼功能的簡單示例:

@login_required
def set_password(request):
    user = request.user
    err_msg = ''
    if request.method == 'POST':
        old_password = request.POST.get('old_password', '')
        new_password = request.POST.get('new_password', '')
        repeat_password = request.POST.get('repeat_password', '')
        # 檢查舊密碼是否正確
        if user.check_password(old_password):
            if not new_password:
                err_msg = '新密碼不能為空'
            elif new_password != repeat_password:
                err_msg = '兩次密碼不一致'
            else:
                user.set_password(new_password)
                user.save()
                return redirect("/login/")
        else:
            err_msg = '原密碼輸入錯誤'
    content = {
        'err_msg': err_msg,
    }
    return render(request, 'set_password.html', content)

用戶如何登陸

如果有一個已驗證的用戶想附加到當前會話(session)中,將通過 login() 函數(shù)完成凉翻。

要在視圖中讓用戶登錄了讨,使用 login() 。它需要 HttpRequest 對象和 User 對象。通過 Django 的 session 框架前计, login() 會在 session 中保存用戶的ID胞谭。
注意,在匿名會話期間設(shè)置的任何數(shù)據(jù)都會在用戶登錄后保留在會話中男杈。

from django.contrib.auth import authenticate, login

def tologin(request):
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(request, username=username, password=password)
    if user is not None:
        login(request, user)
        # Redirect to a success page.
        ...
    else:
        # Return an 'invalid login' error message.
        ...

用戶如何登出

logout(request)
如果已經(jīng)通過 django.contrib.auth.login() 登錄的用戶想退出登錄丈屹,可以在視圖中使用 django.contrib.auth.logout() 。需要傳入 HttpRequest 對象伶棒,并且該函數(shù)不會返回值旺垒。

from django.contrib.auth import logout

def tologout(request):
    logout(request)
    # Redirect to a success page.

注意,如果用戶未登錄苞冯,logout() 不會報錯袖牙。

調(diào)用 logout() 后,當前請求的會話數(shù)據(jù)會被全部清除舅锄。這是為了防止其他使用同一個瀏覽器的用戶訪問前一名用戶的會話數(shù)據(jù)鞭达。如果想在登出后立即向用戶提供的會話中放入任何內(nèi)容,請在調(diào)用 django.contrib.auth.logout() 之后執(zhí)行此操作皇忿。

限制對未登錄用戶的訪問

限制訪問頁面最原始的辦法就是檢查 request.user.is_authenticated 并重定向到登錄頁面畴蹭。

from django.conf import settings
from django.shortcuts import redirect

def my_view(request):
    if not request.user.is_authenticated:
        return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))
    # ...

或者顯示一個錯誤信息:

from django.shortcuts import render

def my_view(request):
    if not request.user.is_authenticated:
        return render(request, 'myapp/login_error.html')
    # ...

login_required 裝飾器

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
    ...

auth_user數(shù)據(jù)表字段詳解

Django中使用的模型User來自于Django的內(nèi)置模型,在數(shù)據(jù)庫中對應(yīng)的數(shù)據(jù)表為auth_user鳍烁。該表有以下字段:

字段 說明
id int類型叨襟,數(shù)據(jù)表主鍵
password varchar類型,用戶密碼
last_lgoin datetime類型幔荒,最近一次登錄時間
is_superuser tinyint類型糊闽,是否為超級用戶
username varchar類型,用戶賬號
first_name varchar類型爹梁,用戶的名字
last_name varchar類型右犹,用戶的姓氏
email 電子郵件
is_staff 判斷用戶是否可以可以登錄Admin系統(tǒng)
is_active tinyint類型,判斷該用戶的狀態(tài)是否被激活
date_joined datetime類型姚垃,賬號的創(chuàng)建時間

擴展默認的auth_user表

內(nèi)置的認證系統(tǒng)這么好用念链,但是auth_user表字段都是固定的那幾個,我在項目中沒法拿來直接使用积糯!這時我們可以通過繼承內(nèi)置的 AbstractUser 類掂墓,來定義一個自己的Model類。這樣既能根據(jù)項目需求靈活的設(shè)計用戶表看成,又能使用Django強大的認證系統(tǒng)了君编。

from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
    """
    用戶信息表
    """
    phone = models.CharField(max_length=11, unique=True)
    qq_num = models.CharField(max_length=11, unique=True)

    
    def __str__(self):
        return self.username

注意:按上面的方式擴展了內(nèi)置的auth_user表之后,一定要在settings.py中告訴Django川慌,使用我新定義的UserInfo表來做用戶認證啦粹。寫法如下:

AUTH_USER_MODEL = "app名.UserInfo"

然后去數(shù)據(jù)庫里面查看一下偿荷,如圖


11.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市唠椭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌忍饰,老刑警劉巖贪嫂,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異艾蓝,居然都是意外死亡力崇,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門赢织,熙熙樓的掌柜王于貴愁眉苦臉地迎上來亮靴,“玉大人,你說我怎么就攤上這事于置〖氲酰” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵八毯,是天一觀的道長搓侄。 經(jīng)常有香客問我,道長话速,這世上最難降的妖魔是什么讶踪? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮泊交,結(jié)果婚禮上乳讥,老公的妹妹穿的比我還像新娘。我一直安慰自己廓俭,他們只是感情好云石,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著白指,像睡著了一般留晚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上告嘲,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天错维,我揣著相機與錄音,去河邊找鬼橄唬。 笑死赋焕,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的仰楚。 我是一名探鬼主播隆判,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼犬庇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了侨嘀?” 一聲冷哼從身側(cè)響起臭挽,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎咬腕,沒想到半個月后欢峰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡涨共,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年纽帖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片举反。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡懊直,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出火鼻,到底是詐尸還是另有隱情室囊,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布凝危,位于F島的核電站波俄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蛾默。R本人自食惡果不足惜懦铺,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望支鸡。 院中可真熱鬧冬念,春花似錦、人聲如沸牧挣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瀑构。三九已至裆针,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間寺晌,已是汗流浹背世吨。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留呻征,地道東北人耘婚。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像陆赋,于是被迫代替她去往敵國和親沐祷。 傳聞我的和親對象是個殘疾皇子嚷闭,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容