Django自帶的auth登錄認(rèn)證

前言:我們在開發(fā)一個網(wǎng)站的時候,無可避免的需要設(shè)計實(shí)現(xiàn)網(wǎng)站的用戶系統(tǒng)时甚。此時我們需要實(shí)現(xiàn)包括用戶注冊隘弊、用戶登錄、用戶認(rèn)證荒适、注銷梨熙、修改密碼等功能,這還真是個麻煩的事情呢刀诬。Django作為一個完美主義者的終極框架咽扇,當(dāng)然也會想到用戶的這些痛點(diǎn)。它內(nèi)置了強(qiáng)大的用戶認(rèn)證系統(tǒng)--auth,它默認(rèn)使用 auth_user 表來存儲用戶數(shù)據(jù)肌割。

一卧蜓、auth模塊的方法介紹:

- 創(chuàng)建用戶
python manage.py createsuperuser
python manage.py createuser
- 模塊的導(dǎo)入:
from django.contrib import auth
- auth中提供的實(shí)用方法:
1. authenticate()

提供了用戶認(rèn)證功能,即驗(yàn)證用戶名以及密碼是否正確把敞,一般需要username 弥奸、password兩個關(guān)鍵字參數(shù)。如果認(rèn)證成功(用戶名和密碼正確有效)奋早,便會返回一個 User 對象盛霎。authenticate()會在該 User 對象上設(shè)置一個屬性來標(biāo)識后端已經(jīng)認(rèn)證了該用戶,且該信息在后續(xù)的登錄過程中是需要的耽装。

user = authenticate(username='theuser',password='thepassword')
2.login(HttpRequest, user)

該函數(shù)接受一個HttpRequest對象愤炸,以及一個經(jīng)過認(rèn)證的User對象。該函數(shù)實(shí)現(xiàn)一個用戶登錄的功能掉奄。它本質(zhì)上會在后端為該用戶生成相關(guān)session數(shù)據(jù)

from django.contrib.auth import authenticate, login

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

該函數(shù)接受一個HttpRequest對象规个,無返回值。當(dāng)調(diào)用該函數(shù)時姓建,當(dāng)前請求的session信息會全部清除诞仓。該用戶即使沒有登錄,使用該函數(shù)也不會報錯速兔。

from django.contrib.auth import logout

def logout_view(request):
    logout(request)
    # Redirect to a success page.
4.is_authenticated()

用來判斷當(dāng)前請求是否通過了認(rèn)證

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

auth 給我們提供的一個裝飾器工具墅拭,用來快捷的給某個FBV視圖添加登錄校驗(yàn)。

from django.contrib.auth.decorators import login_required

@login_required
def my_view(request):
    ...
6.auth 給我們提供的一個裝飾器工具涣狗,用來快捷的給某個CBV視圖添加登錄校驗(yàn)谍婉。
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator

class Home(views.View):

    @method_decorator(login_required)
    def get(self, request):
        return render(request, 'home.html')

若用戶沒有登錄,則會跳轉(zhuǎn)到django默認(rèn)的 登錄URL '/accounts/login/ ' 并傳遞當(dāng)前訪問url的絕對路徑 (登陸成功后镀钓,會重定向到該路徑)穗熬。如果需要自定義登錄的URL,則需要在settings.py文件中通過LOGIN_URL進(jìn)行修改掸宛。 LOGIN_URL = '/login/' # 這里配置成你項(xiàng)目登錄頁面的路由

7.create_user()

auth 提供的一個創(chuàng)建新用戶的方法死陆,需要提供必要參數(shù)(username招拙、password)等唧瘾。

from django.contrib.auth.models import User

user = User.objects.create_user(username = '用戶名', password = '密碼', email = '郵箱', ...)
create_superuser()
8.create_superuser()

auth 提供的一個創(chuàng)建新的超級用戶的方法,需要提供必要參數(shù)(username别凤、password)等饰序。

from django.contrib.auth.models import User

user = User.objects.create_superuser(username = '用戶名', password = '密碼', email = '郵箱', ...)
check_password(password)
9.check_password(password)

auth 提供的一個檢查密碼是否正確的方法,需要提供當(dāng)前請求用戶的密碼规哪。密碼正確返回True求豫,否則返回False。

ret = user.check_password('密碼')
10.set_password(password)

auth 提供的一個修改密碼的方法,接收 要設(shè)置的新密碼 作為參數(shù)蝠嘉。注意:設(shè)置完一定要調(diào)用用戶對象的save方法W罱!蚤告!

user.set_password(password='')  
user.save()

二努酸、User對象的屬性

  • username,
  • password
  • is_staff : 用戶是否擁有網(wǎng)站的管理權(quán)限.
  • is_active : 是否允許用戶登錄, 設(shè)置為 False杜恰,可以在不刪除用戶的前提下禁止用戶登錄获诈。

三、擴(kuò)展默認(rèn)的auth_user表

我們可以通過繼承內(nèi)置的 AbstractUser 類心褐,來定義一個自己的Model類舔涎。這樣既能根據(jù)項(xiàng)目需求靈活的設(shè)計用戶表,又能使用Django強(qiáng)大的認(rèn)證系統(tǒng)了逗爹。

from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
    """
    用戶信息表
    """
    nid = models.AutoField(primary_key=True)
    phone = models.CharField(max_length=11, null=True, unique=True)
    
    def __str__(self):
        return self.username

注意:按上面的方式擴(kuò)展了內(nèi)置的auth_user表之后亡嫌,一定要在settings.py中告訴Django,我現(xiàn)在使用我新定義的UserInfo表來做用戶認(rèn)證掘而。寫法如下:

# 引用Django自帶的User表昼伴,繼承使用時需要設(shè)置
AUTH_USER_MODEL = "app名.UserInfo"

再次注意:一旦我們指定了新的認(rèn)證系統(tǒng)所使用的表,我們就需要重新在數(shù)據(jù)庫中創(chuàng)建該表镣屹,而不能繼續(xù)使用原來默認(rèn)的auth_user表了圃郊。

四、一個修改密碼功能的簡單示例:

@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)

五女蜈、通過繼承內(nèi)置的 AbstractUser 類持舆,來定義一個自己的Model類

from django.contrib.auth.models import AbstractUser
class UserInfo(AbstractUser):
    """
    用戶信息表
    """
    nid = models.AutoField(primary_key=True)
    phone = models.CharField(max_length=11, null=True, unique=True)
    
    def __str__(self):
        return self.username
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市伪窖,隨后出現(xiàn)的幾起案子逸寓,更是在濱河造成了極大的恐慌,老刑警劉巖覆山,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竹伸,死亡現(xiàn)場離奇詭異,居然都是意外死亡簇宽,警方通過查閱死者的電腦和手機(jī)勋篓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來魏割,“玉大人譬嚣,你說我怎么就攤上這事〕” “怎么了拜银?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵殊鞭,是天一觀的道長。 經(jīng)常有香客問我尼桶,道長操灿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任泵督,我火速辦了婚禮牲尺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘幌蚊。我一直安慰自己谤碳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布溢豆。 她就那樣靜靜地躺著蜒简,像睡著了一般。 火紅的嫁衣襯著肌膚如雪漩仙。 梳的紋絲不亂的頭發(fā)上搓茬,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天,我揣著相機(jī)與錄音队他,去河邊找鬼卷仑。 笑死,一個胖子當(dāng)著我的面吹牛麸折,可吹牛的內(nèi)容都是我干的锡凝。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼垢啼,長吁一口氣:“原來是場噩夢啊……” “哼窜锯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起芭析,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤锚扎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后馁启,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驾孔,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年惯疙,在試婚紗的時候發(fā)現(xiàn)自己被綠了翠勉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡螟碎,死狀恐怖眉菱,靈堂內(nèi)的尸體忽然破棺而出迹栓,到底是詐尸還是另有隱情掉分,我是刑警寧澤俭缓,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站酥郭,受9級特大地震影響华坦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜不从,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一惜姐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧椿息,春花似錦歹袁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至乏矾,卻和暖如春孟抗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钻心。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工凄硼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捷沸。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓摊沉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親痒给。 傳聞我的和親對象是個殘疾皇子坯钦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評論 2 359

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