django 用戶設計

大多數時候垦江,我們需要自己為自己的用戶設計單獨的數據表剩拢,而不是使用django本身的auth
那么我們需要繼承AbstractBaseUser

Django 期望你自定義的 User model 滿足一些最低要求

  1. 模型必須有一個唯一的字段可被用于識別目的臀玄∪〗伲可以是一個用戶名栋猖,電子郵件地址害碾,或任何其它獨特屬性。
  2. 定制一個User Model最簡單的方式是構造一個兼容的用戶模型繼承于AbstractBaseUser啊胶。
    AbstractBaseUser提供了User類最核心的實現甸各,包括哈希的passwords和 標識的密碼重置。

下面為一些AbstractBaseUser的子類必須定義的關鍵的字段和方法:

  1. USERNAME_FIELD
    必須設置焰坪。 設置認證標識趣倾,設置成標識的字段 unique=True
  2. 列表中不應該包含USERNAME_FIELD字段和password字段。
  3. is_active
    必須定義某饰。 一個布爾屬性儒恋,標識用戶是否是 "active" 的。AbstractBaseUser默認為 Ture黔漂。
  4. get_full_name()
    必須定義诫尽。 long格式的用戶標識弥搞。
  5. get_short_name()
    必須定義谨娜。 short格式的用戶標識。

下面為一些AbstractBaseUser的子類可以使用的方法:

  1. get_username()
    返回 USERNAME_FIELD 的值埋同。

  2. is_anonymous()
    一直返回 False劳较。用來區(qū)分 AnonymousUser驹止。

  3. is_authenticated()
    一直返回 Ture浩聋。用來告訴用戶已被認證。

  4. set_password(raw_password)
    設置密碼臊恋。按照給定的原始字符串設置用戶的密碼衣洁,taking care of the password hashing。 不保存 AbstractBaseUser 對象抖仅。如果沒有給定密碼坊夫,密碼就會被設置成不使用,同用set_unusable_password()撤卢。

  5. check_password(raw_password)
    檢查密碼是否正確环凿。 給定的密碼正確返回 True。

  6. set_unusable_password()
    設置user無密碼放吩。 不同于密碼為空智听,如果使用check_password(),則不會返回True渡紫。不保存AbstractBaseUser 對象到推。

  7. has_usable_password()
    如果設置了set_unusable_password(),返回False惕澎。

  8. get_session_auth_hash()
    返回密碼字段的HMAC莉测。 Used for Session invalidation on password change.

為你的User模型自定義一個管理器

如果你的User模型定義了這些字段:username, email, is_staff, is_active, is_superuser, last_login, and date_joined跟默認的User沒什么區(qū)別, 那么你還不如僅僅替換Django的UserManager就行了; 總之,如果你的User定義了不同的字段, 你就要去自定義一個管理器,它繼承自BaseUserManager并提供兩個額外的方法:

create_user(username_field, password=None, other_fields)
接受username field和required字段來創(chuàng)建用戶唧喉。

create_superuser(username_field, password, other_fields)
接受username field和required字段來創(chuàng)建superuser捣卤。

擴展Django默認的User

如果你完全滿意Django的用戶模型和你只是想添加一些額外的屬性信息,你只需繼承 django.contrib.auth.models.AbstractUser 然后添加自定義的屬性。AbstractUser 作為一個抽象模型提供了默認的User的所有的實現(AbstractUser provides the full implementation of the default User as an abstract model.)八孝。

自定義用戶與內置身份驗證表單

Django內置的forms和views和相關聯的user model有一些先決條件董朝。如果你的user model沒有遵循同樣的條件,則需要定義一個替代的form唆阿,通過form成為身份驗證views配置的一部分益涧。

UserCreationForm

依賴于User Model. 擴展User時必須重寫。

UserChangeForm

依賴于User Model. 擴展User時必須重寫驯鳖。

AuthenticationForm

Works with any subclass of AbstractBaseUser, and will adapt to use the field defined in USERNAME_FIELD.

PasswordResetForm

Assumes that the user model has a field named email that can be used to identify the user and a boolean field named is_active to prevent password resets for inactive users.

SetPasswordForm

Works with 任何AbstractBaseUser子類

PasswordChangeForm

Works with 任何AbstractBaseUser子類

AdminPasswordChangeForm

Works with 任何AbstractBaseUser子類

自定義用戶和django.contrib.admin

如果你想讓你自定義的User模型也可以在站點管理上工作,那么你的模型應該再定義一些額外的屬性和方法久免。 這些方法允許管理員去控制User到管理內容的訪問:

is_staff

是否允許user訪問admin界面

is_active

用戶是否活躍浅辙。

has_perm(perm, obj=None):

user是否擁有perm權限。

has_module_perms(app_label):

user是否擁有app中訪問models的權限

你同樣也需要注冊你自定義的用戶模型到admin阎姥。如果你的自定義用戶模型擴展于django.contrib.auth.models.AbscustomauthtractUser记舆,你可以用django的 django.contrib.auth.admin.UserAdmin 類。如果你的用戶模型擴展于 AbstractBaseUser呼巴,你需要自定義一個ModelAdmin類泽腮。他可能繼承于默認的django.contrib.auth.admin.UserAdmin御蒲。然而,你也需要覆寫一些django.contrib.auth.models.AbstractUser 字段的定義不在你自定義用戶模型中的诊赊。

自定義用戶和權限

如果想讓在自定義用戶模型中包含Django的權限控制框架變得簡單厚满,Django提供了PermissionsMixin。這是一個抽象的類碧磅,你可以為你的自定義用戶模型中的類的層次結構中包含它碘箍。它提供給你所有Django權限類所必須的的方法和字段

PermissionsMixin提供的這些方法和屬性

is_superuser

布爾類型。 Designates that this user has all permissions without explicitly assigning them.

get_group_permissions(obj=None)

Returns a set of permission strings that the user has, through their groups.

If obj is passed in, only returns the group permissions for this specific object.

get_all_permissions(obj=None)

Returns a set of permission strings that the user has, both through group and user permissions.

If obj is passed in, only returns the permissions for this specific object.

has_perm(perm, obj=None)

Returns True if the user has the specified permission, where perm is in the format "<app label>.<permission codename>" (see permissions). If the user is inactive, this method will always return False.

If obj is passed in, this method won’t check for a permission for the model, but for this specific object.

has_perms(perm_list, obj=None)

Returns True if the user has each of the specified permissions, where each perm is in the format "<app label>.<permission codename>". If the user is inactive, this method will always return False.

If obj is passed in, this method won’t check for permissions for the model, but for the specific object.

has_module_perms(package_name)

Returns True if the user has any permissions in the given package (the Django app label). If the user is inactive, this method will always return False.

最后鲸郊,為了保證在admin或者xadmin中手動創(chuàng)建的用戶丰榴,其密碼能夠自動加密,那么重載你的user model的save方法

def save(self, *arg, **kwargs):
    self.password = func(self.password)
    super(User, self).save(*arg, **kwargs)
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末秆撮,一起剝皮案震驚了整個濱河市四濒,隨后出現的幾起案子,更是在濱河造成了極大的恐慌职辨,老刑警劉巖盗蟆,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異拨匆,居然都是意外死亡姆涩,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進店門惭每,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骨饿,“玉大人,你說我怎么就攤上這事台腥『曜福” “怎么了?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵黎侈,是天一觀的道長察署。 經常有香客問我,道長峻汉,這世上最難降的妖魔是什么贴汪? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮休吠,結果婚禮上扳埂,老公的妹妹穿的比我還像新娘。我一直安慰自己瘤礁,他們只是感情好阳懂,可當我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般岩调。 火紅的嫁衣襯著肌膚如雪巷燥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天号枕,我揣著相機與錄音缰揪,去河邊找鬼。 笑死堕澄,一個胖子當著我的面吹牛邀跃,可吹牛的內容都是我干的。 我是一名探鬼主播蛙紫,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼拍屑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了坑傅?” 一聲冷哼從身側響起僵驰,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎唁毒,沒想到半個月后蒜茴,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡浆西,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年粉私,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片近零。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡诺核,死狀恐怖,靈堂內的尸體忽然破棺而出久信,到底是詐尸還是另有隱情窖杀,我是刑警寧澤,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布裙士,位于F島的核電站入客,受9級特大地震影響,放射性物質發(fā)生泄漏腿椎。R本人自食惡果不足惜桌硫,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望啃炸。 院中可真熱鬧鞍泉,春花似錦、人聲如沸肮帐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽训枢。三九已至托修,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間恒界,已是汗流浹背睦刃。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留十酣,地道東北人涩拙。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像耸采,于是被迫代替她去往敵國和親兴泥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,446評論 2 359

推薦閱讀更多精彩內容