【Django】會話、用戶和認證

本章著重總結(jié)Django的用戶與認證

一. cookies

? ? http(s)本身是無狀態(tài)的魏身,當前請求和下次請求之前無任何狀態(tài)保持惊橱,為了存儲狀態(tài),首先應(yīng)運而生的是cookies箭昵。在Django中税朴,每個request都包含了一個COOKIES對象,可以像字典一樣使用它。
? ? 雖然cookies能解決了狀態(tài)保持問題家制,但是引出了其他問題:
? ? ? ? a. 瀏覽器不保證會存儲,是否接受cookies在瀏覽器端用戶可以控制正林;
? ? ? ? b. cookies在瀏覽器中是可清除的,不可存儲重要信息颤殴,否則可能發(fā)生不可恢復(fù)的問題觅廓;
? ? ? ? c. http是明文傳輸,因此中間人容易攔截獲取cookies并使用涵但,不安全杈绸,容易被篡改;
?

二. session

? ? 為了解決cookies所帶來的問題矮瘟,session(會話)已然成為了web開發(fā)青睞的手段瞳脓。在Django中,自帶session框架解決了這個需求,存取每個用戶的任意數(shù)據(jù)芥永,該數(shù)據(jù)可存儲在服務(wù)器端或者以文件等方式存儲篡殷。
?
? ? 在Django中钝吮,sessions 功能是通過一個中間件(middleware)和一個模型(model)來實現(xiàn)的埋涧,為了使用session功能,需要確認以下(默認情況是打開):
? ?? ? a. 確認MIDDLEWARE(中間件) django.contrib.sessions.middleware.SessionMiddleware被添加在MIDDLEWARE
? ?? ? b. 確認 session app(系統(tǒng)) django.contrib.sessions被添加在INSTALLED_APPS
? ?激活后奇瘦,每個httpRequest都有一個session屬性棘催,是一個字典對象,每個session對象都是由一個隨機的32位哈希串來標識
?
? ? 由于session是依賴cookies來設(shè)計的耳标,session的有效期等需要進行一些設(shè)置醇坝,比如關(guān)閉瀏覽器失效還是有效期一個星期失效等,常用的如下:
? ? ? ? 1. SESSION_ENGINE 設(shè)置引擎次坡,決定session保存在哪里呼猪,默認數(shù)據(jù)庫
? ? ? ? 2. SESSION_COOKIE_NAME Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串
? ? ? ? 3. SESSION_COOKIE_PATH 保存的路徑
? ? ? ? 4. SESSION_COOKIE_DOMAIN 保存的域名
? ? ? ? 5. SESSION_COOKIE_SECURE 是否https傳輸cookie
? ? ? ? 6. SESSION_COOKIE_AGE cookie的有效期
? ? ? ? 7. SESSION_EXPIRE_AT_BROWSER_CLOSE 是否關(guān)閉瀏覽器就失效
? ? ? ? 8. SESSION_SAVE_EVERY_REQUEST 是否每次請求都保存Session砸琅,默認修改之后才保存
?

三. 用戶宋距、認證與授權(quán)

? ? auth模塊(app)是Django提供的標準認證與授權(quán)系統(tǒng),主要做2件事:
? ?? ? a. 認證用戶症脂,主要比對系統(tǒng)中是否存在該用戶
? ?? ? b. 檢查權(quán)限谚赎,主要確定用戶是否有某些操作淫僻,即被授權(quán)某些操作
? ? 默認情況,應(yīng)用到的中間件django.contrib.auth.middleware.AuthenticationMiddleware 和app 系統(tǒng)django.contrib.auth是打開的壶唤。User模型是auth模塊中維護的用戶信息關(guān)系模型雳灵。主要字段用戶名蔗喂、密碼膀息、郵箱等辅斟,可在auth/models.py中查看具體姐军,繼承關(guān)系如下
? ?? ?User----繼承----> AbstractUser---->AbstractBaseUser和PermissionsMixin
? ? 其中AbstractBaseUser定義了對象字段和操作數(shù)據(jù)表的API儒将,PermissionsMixin定義了權(quán)限相關(guān)內(nèi)容
? ? 本次建系統(tǒng)的過程中员舵,用戶內(nèi)置的User不夠滿足需求工扎,采用了擴展AbstractUser的方式泪酱,怎么創(chuàng)建適合的User模型得看需求钓觉,這篇文章已經(jīng)說得很清楚茴肥,可參考:http://www.cnblogs.com/yxi-liu/p/8684504.html
?
? ? 用戶的認證
? ?? ?authenticate(),通過用戶名稱和密碼進行用戶的認證
? ?? ?login(request, user),該函數(shù)接受一個 HttpRequest 對象和一個 User 對象作為參數(shù)并使用Django的會話( session )框架把用戶的ID保存在該會話中
? ?? ?logout(),實際就是清除了session中的user信息荡灾,它接受一個HttpRequest對象并且沒有返回值,所以瓤狐,因為沒有返回值,需要返回一個頁面批幌。

from django.contrib.auth import login,logout,authenticate
user=authenticate(username=userName, password=password)
    if user is not None and user.is_active:
            login(request, user)#認證通過后础锐,調(diào)用login方法,主要是設(shè)置session

?
?
? ? 說完了用戶的問題荧缘,接下來說說權(quán)限與組
? ? 使用auth 原生或擴展的User皆警,執(zhí)行完migratemakemigrations,即python3 manage.py migrate auth``python3 manage.py makemigrations auth后截粗,會在數(shù)據(jù)庫中生成3個表
? ? ? ? auth_group:組信姓,包括id和name
? ? ? ? auth_group_permission: 組權(quán)限,包括id绸罗、group_id意推、permission_id
? ? ? ? auth_permission: 權(quán)限信息,包括name珊蟀、content_type_id和codename字段菊值,codename主要是使用權(quán)限方法傳入的參數(shù),content_type_id與模型相關(guān)
? ? permission總是與model對應(yīng)的育灸,如果一個object不是model的實例腻窒,我們無法為它創(chuàng)建
?
? ? 在創(chuàng)建model時,可通過元類的方式自定義權(quán)限

class Meta:
    permissions =
              (
                    ("view_server", "can view server"),//(codename,name)
                    ("change_server_status", "Can change the status of server"),
              )

? ? 或者通過腳本的方式設(shè)置權(quán)限

#假設(shè)model為blog磅崭,app為blogs
from django.contrib.contenttypes.models import  ContentType
from django.contrib.auth.models import Permission
content_type=ContentType.objects.get_for_model(blog) 
permissions=Permission.objects.create(codename="can_edit_blog",name="edit blog ",content_type=content_type)
#以上權(quán)限可通過user_permissions或permission屬性的Groups分配給一個User對象
user.user_permissions.add(permissions)
group=Group.objects.get(name='only_view_person')
user.groups.add(group)
#以上只是舉例為用戶添加權(quán)限儿子,其他方法有clear()、set()绽诚、remove()

? ? 驗證權(quán)限

user.has_perm('blogs.can_edit_blog')#或者使用裝飾器@permission_required("blogs.can_edit_blog")裝飾函數(shù)
#頁面驗證權(quán)限
{%if perms.blogs.can_edit_blog%}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末典徊,一起剝皮案震驚了整個濱河市杭煎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卒落,老刑警劉巖羡铲,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異儡毕,居然都是意外死亡也切,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門腰湾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雷恃,“玉大人,你說我怎么就攤上這事费坊〉够保” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵附井,是天一觀的道長讨越。 經(jīng)常有香客問我,道長永毅,這世上最難降的妖魔是什么把跨? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮沼死,結(jié)果婚禮上着逐,老公的妹妹穿的比我還像新娘。我一直安慰自己意蛀,他們只是感情好耸别,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著浸间,像睡著了一般太雨。 火紅的嫁衣襯著肌膚如雪吟榴。 梳的紋絲不亂的頭發(fā)上魁蒜,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機與錄音吩翻,去河邊找鬼兜看。 笑死,一個胖子當著我的面吹牛狭瞎,可吹牛的內(nèi)容都是我干的细移。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼熊锭,長吁一口氣:“原來是場噩夢啊……” “哼弧轧!你這毒婦竟也來了雪侥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤精绎,失蹤者是張志新(化名)和其女友劉穎速缨,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體代乃,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡旬牲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了搁吓。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片原茅。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖堕仔,靈堂內(nèi)的尸體忽然破棺而出擂橘,到底是詐尸還是另有隱情,我是刑警寧澤摩骨,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布贝室,位于F島的核電站,受9級特大地震影響仿吞,放射性物質(zhì)發(fā)生泄漏滑频。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一唤冈、第九天 我趴在偏房一處隱蔽的房頂上張望峡迷。 院中可真熱鬧,春花似錦你虹、人聲如沸绘搞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽夯辖。三九已至,卻和暖如春董饰,著一層夾襖步出監(jiān)牢的瞬間蒿褂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工卒暂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留啄栓,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓也祠,卻偏偏與公主長得像昙楚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子诈嘿,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

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

  • 利用HTTP協(xié)議向服務(wù)器傳參的幾種途徑堪旧、響應(yīng)削葱、Cookie、Session淳梦、類視圖佩耳、中間件 注意: 1>Dja...
    Cestine閱讀 1,247評論 0 2
  • 首先要明確,登陸認證也是自己定義的對url的處理谭跨,如果一個項目調(diào)用了django的Admin干厚,那么在project...
    llicety閱讀 3,590評論 0 6
  • 模塊間聯(lián)系越多,其耦合性越強螃宙,同時表明其獨立性越差( 降低耦合性蛮瞄,可以提高其獨立性)。軟件設(shè)計中通常用耦合度和內(nèi)聚...
    riverstation閱讀 2,064評論 0 8
  • 點我查看本文集的說明及目錄谆扎。 本項目相關(guān)內(nèi)容包括: 實現(xiàn)過程: CH7 創(chuàng)建在線商店 CH8 管理支付和訂單 CH...
    學以致用123閱讀 4,870評論 8 9
  • 今天是女兒入小學以來挂捅,學校召開的第三次家長會!我再一次如約而至…… 家長會剛開始堂湖,班主任就甩出了一個問題...
    李墨兒媽媽閱讀 104評論 0 0