Django權限系統auth模塊詳解

轉自:原文出處

auth模塊是Django提供的標準權限管理系統,可以提供用戶身份認證, 用戶組和權限管理

auth可以和admin模塊配合使用, 快速建立網站的管理系統。

在INSTALLED_APPS中添加'django.contrib.auth'使用該APP, auth模塊默認啟用。

User

User是auth模塊中維護用戶信息的關系模式(繼承了models.Model), 數據庫中該表被命名為auth_user.

User表的SQL描述:

CREATE TABLE "auth_user" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "password" varchar(128) NOT NULL, "last_login" datetime NULL, "is_superuser" bool NOT NULL, "first_name" varchar(30) NOT NULL, "last_name" varchar(30) NOT NULL, "email" varchar(254) NOT NULL, "is_staff" bool NOT NULL, "is_active" bool NOT NULL, "date_joined" datetime NOT NULL, "username" varchar(30) NOT NULL UNIQUE )

auth模塊提供了很多API管理用戶信息, 在必要的時候我們可以導入User表進行操作, 比如其它表需要與User建立關聯時:

from django.contrib.auth.models import User

創建用戶

user = User.objects.create_user(username, email, password)

建立user對象:

user.save()

在此,需要調用save()方法才可將此新用戶保存到數據庫中。

auth模塊不存儲用戶密碼明文而是存儲一個Hash值, 比如迭代使用Md5算法.

認證用戶

使用authenticate模塊,使用時,先導入模塊:

from django.contrib.auth import authenticate

使用關鍵字參數傳遞賬戶和憑據:

user = authenticate(username=username, password=password)

認證用戶的密碼是否有效, 若有效則返回代表該用戶的user對象, 若無效則返回None。

需要注意的是:該方法不檢查is_active標志位。

修改用戶密碼

修改密碼是User的實例方法, 該方法不驗證用戶身份:

user.set_password(new_password)

通常該方法需要和authenticate配合使用:

user = auth.authenticate(username=username, password=old_password)
if user is not None:user.set_password(new_password)user.save()

登錄

先導入模塊:

from django.contrib.auth import login

login向session中添加SESSION_KEY, 便于對用戶進行跟蹤:

login(request, user)

login不進行認證,也不檢查is_active標志位, 一般和authenticate配合使用:

user = authenticate(username=username, password=password)
if user is not None:if user.is_active:login(request, user)

auth/__init__.py中可以看到login的源代碼。

退出登錄

logout會移除request中的user信息, 并刷新session:

from django.contrib.auth import logoutdef logout_view(request): logout(request)

權限判斷,只允許登錄用戶訪問

@login_required修飾器修飾的view函數會先通過session key檢查是否登錄, 已登錄用戶可以正常的執行操作, 未登錄用戶將被重定向到login_url指定的位置。若未指定login_url參數, 則重定向到settings.LOGIN_URL

from django.contrib.auth.decorators import login_required @login_required(login_url='/accounts/login/') def my_view(request): ...

Group

django.contrib.auth.models.Group定義了用戶組的模型, 每個用戶組擁有idname兩個字段, 該模型在數據庫被映射為auth_group數據表。

User對象中有一個名為groups的多對多字段, 多對多關系由auth_user_groups數據表維護。Group對象可以通過user_set反向查詢用戶組中的用戶。

我們可以通過創建刪除Group對象來添加或刪除用戶組:

# add
group = Group.objects.create(name=group_name)
group.save()
# del
group.delete()

我們可以通過標準的多對多字段操作管理用戶與用戶組的關系:

#用戶加入用戶組
user.groups.add(group)
#或者
group.user_set.add(user)#用戶退出用戶組
user.groups.remove(group)
#或者 group.user_set.remove(user) #用戶退出所有用戶組 user.groups.clear() #用戶組中所有用戶退出組 group.user_set.clear()

Permission

Django的auth系統提供了模型級的權限控制, 即可以檢查用戶是否對某個數據表擁有增(add), 改(change), 刪(delete)權限。

auth系統無法提供對象級的權限控制, 即檢查用戶是否對數據表中某條記錄擁有增改刪的權限。如果需要對象級權限控制可以使用django-guardian

假設在博客系統中有一張article數據表管理博文, auth可以檢查某個用戶是否擁有對所有博文的管理權限, 但無法檢查用戶對某一篇博文是否擁有管理權限。

檢查用戶權限

user.has_perm方法用于檢查用戶是否擁有操作某個模型的權限:

user.has_perm('blog.add_article')
user.has_perm('blog.change_article') user.has_perm('blog.delete_article')

上述語句檢查用戶是否擁有blog這個app中article模型的添加權限, 若擁有權限則返回True。

has_perm僅是進行權限檢查, 即是用戶沒有權限它也不會阻止程序員執行相關操作。

@permission_required裝飾器可以代替has_perm并在用戶沒有相應權限時重定向到登錄頁或者拋出異常。

# permission_required(perm[, login_url=None, raise_exception=False])@permission_required('blog.add_article')
def post_article(request): pass

每個模型默認擁有增(add), 改(change), 刪(delete)權限。在django.contrib.auth.models.Permission模型中保存了項目中所有權限。

該模型在數據庫中被保存為auth_permission數據表。每條權限擁有id?,name?,?content_type_id,?codename四個字段。

管理用戶權限

User和Permission通過多對多字段user.user_permissions關聯,在數據庫中由auth_user_user_permissions數據表維護。

#添加權限
user.user_permissions.add(permission)#刪除權限: 
user.user_permissions.delete(permission)#清空權限: 
user.user_permissions.clear()

用戶擁有他所在用戶組的權限, 使用用戶組管理權限是一個更方便的方法。Group中包含多對多字段permissions, 在數據庫中由auth_group_permissions數據表維護。

#添加權限: 
group.permissions.add(permission)#刪除權限: 
group.permissions.delete(permission)#清空權限: 
group.permissions.clear()

自定義權限

在定義Model時可以使用Meta自定義權限:

class Discussion(models.Model): ... class Meta: permissions = ( ("create_discussion", "Can create a discussion"), ("reply_discussion", "Can reply discussion"), )

判斷用戶是否擁有自定義權限:

user.has_perm('blog.create_discussion')

轉載于:https://www.cnblogs.com/perfei/p/11454541.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447875.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447875.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447875.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

化妝、護膚的步驟

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 雖然從不化妝,但也記錄一下,也許多年后我還是有時間和耐心去化一下呢 .... ---------------------------------…

2014年駕考科目三考試扣分標準(細則)

【導語】:2014年駕考科目三考試的扣分標準是什么?2014年駕考科目三考試的扣分點有哪些?2014年路考有哪些扣分標準?路考扣分項目盤點 一、考試時出現下列情形之一的,評判為不合格: 1、不按規定使用安全帶或…

Windows10 網絡圖標消失 連接不上網絡 的解決方法

【背景】電腦win10的,下載一個軟件重啟之后網絡圖標消失,并且無法聯網。 參照此解決方法: 原因: 【Windows Event Log】服務對應的注冊表出現問題,導致無法正常啟動,進而導致一些依賴于它的聯網服務無法正常…

VUE:解決 [Vue warn]: Error in render: “TypeError: item.slice is not a function“ (取部分數據)

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. 雙重循環中使用 slice方法,報錯: [Vue warn]: Error in render: "TypeError: item.slice is not a fun…

廣州電子路考視頻發布 2014廣州電子路考考點

【導語】:科目三電子考考點是什么?廣州電子路考有哪些考點/考試項目?廣州交警在其官方微博發布了長達9分鐘的科目三電子考視頻,詳解考試要點。一起來看看2014廣州電子路考考點/考試項目大全。 科目三電子考考點是什么?沒摸過考試車“蒙查查…

函數的重載

函數的重載(function overloading): C允許用同一個函數名定義多個函數,而這些函數的參數個數和參數類型可以不相同。 一個函數名重新賦予它新的含義,使得一個函數名可以多用。 重載函數的參數個數、參數類型或參數順序…

在 js 中怎樣獲得 checkbox 里選中的多個值?(jQuery)

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 思路:利用name屬性值獲取checkbox對象,然后循環判斷checked屬性(true表示被選中,false表…

GFM與博客園markdown測試

博客園流程圖 st>start: Start e>end op>operation: My Operation cond>condition: Yes or No?st->op->cond cond(yes)->e cond(no)->op 轉載于:https://www.cnblogs.com/oneTOinf/p/11462716.html

路考步驟七步走 科目三考試一定沒問題!

路考步驟一:科目三考試時,在上車前,無論你在車輛的什么位置,請務必從車的右側繞過車頭走到駕駛室門前,先觀察車前道路上是否有障礙,再觀察車后方是否有來車,確保安全后,打開車門&…

VUE項目中 獲得多個復選框 checkbox 選中的值(jquery)+ 解決 Uncaught TypeError: Cannot read property ‘push‘ of undefine

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 1. 表格生成后第一列是復選框,效果: 表格是直接循環展示的后臺返回數據,代碼寫法: 2. 得…

[開源] FreeSql.AdminLTE.Tools 根據實體類生成后臺管理代碼

前言 FreeSql 發布至今已經有9個月,功能漸漸完善,自身的生態也逐步形成,早在幾個月前寫過一篇文章《ORM 開發環境之利器:MVC 中間件 FreeSql.AdminLTE》,您可以先閱讀上一篇文章內容了解來龍去脈,再回到這里…

新駕考科目三-2014新交規科目三大路考試技巧

新駕考科目三考試內容及變化: A、上車準備;B、起步;C、直線行駛; D、加減擋位操作;E、變更車道; F、靠邊停車;G、直行通過路口; H、路口左轉彎;I、路口右轉彎;J、通過人行橫道線;K、通過學校區域;L、通過公共汽車站;M、會車; N、超車;P、掉頭;Q、夜間行駛。增加了加…

《小狗錢錢》:理財首先應該有一種強烈的意識

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 《小狗錢錢》讀完了。以下是個人覺得很有幫助和啟發意義的摘抄。 1) "忽視就是一種認輸"。2) 并非困難使我們放棄&#xff0c…

R語言 plot()函數 基礎用法

plot(xx軸數據,yy軸數據,main"標題",sub"子標題",type"線型",xlab"x軸名稱",ylab"y軸名稱",xlim c(x軸范圍,x軸范圍),ylim c(y軸范圍,y軸范圍)) 轉載于:https://www.cnblogs…

廣州駕校考試實際道路考試注意事項(圖)

導讀:面對實際道路考試時,大家都會有些緊張,因為這個科目不再只是面對場地,而是要面對各種狀況和各種車輛,也是獲取駕照的最后一個關卡。因此,為了讓大家掌握考試的整個流程,網為大家帶來科目四…

《 Docker 進階與實戰 》 讀書筆記

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 以下內容全文出自書目:《 Docker 進階與實戰 》 1. Docker 定義:一個開源的容器引擎,可以方便地對容…

農村女人與城市女人的差別

1、農村女孩20歲結婚當媽很普遍,城市女孩三十多歲做剩女很普遍。 2、農村女孩對男方主要談彩禮和家庭條件;城市女孩對男方主要談房子和車子。 3、農村女人婚后不管經濟條件如何立馬生孩子,且基本上是兩胎以上;城市女人婚后得看條件計劃生孩子&…

【轉】R語言函數總結

原博;R語言與數據挖掘:公式;數據;方法R語言特征 對大小寫敏感通常,數字,字母,. 和 _都是允許的(在一些國家還包括重音字母)。不過,一個命名必須以 . 或者字母開頭,并且如…

《工作前5年,決定你一生的財富》三公子TXT,PDF,epub,mobi,azw3,kindle電子書下載

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 去年收到編輯出書的邀約,想讓我把這些年的理財心得做個整理,跟學習理財的朋友一起分享。其實,收到邀…

潛藏在人體體內的12種毒素

人的身體內有12大毒素為細菌的增殖和侵襲鋪好了道路。百病不生,就得清除身體內的12毒素。身體內有哪些毒素以及百病不生的解決方法: 體內毒素1.壞膽固醇 壞膽固醇主要表現為:初期沒有自覺癥狀,出現黃色瘤(淡黃色的脂肪腫塊)時…