在Django的世界中,在權限管理中有內置的Authentication系統。用來管理帳戶,組,和許可。還有基於cookie的用戶session。這篇blog主要用來探討這套內置的Authentication系統。
Django內置的權限系統包括以下三個部分:
- 用戶(Users)
- 許可(Permissions):用來定義一個用戶(user)是否能夠做某項任務(task)
- 組(Groups):一種可以批量分配許可到多個用戶的通用方式
首先需要在Django中安裝這個組件:
- 將'django.contrib.auth'和'django.contrib.contenttypes'放到settings.py中的INSTALLED_APPS中。(使用contenttypes的原因是auth中的Permission模型依賴於contenttypes)
- 執行manage.py syncdb
裝好了就可以開始使用了;我們可以執行manage.py shell來啟動腳本,對其中的一些API進行學習和使用。
首先最重要的開始就是User模型
User模型對應於一個用戶,一個帳戶,位於'django.contrib.auth.models'模塊中。
User對象有兩個多對多的屬性分別是:groups和user_permissions:
>>>from django.contrib.auth.models import User
>>>es = User.objects.create_user('esperyong','esperyong@gmail.com','123456')
>>>es.groups
<django.db.models.fields.related.ManyRelatedManager at 0x10d0642d0>
>>>es.user_permissions
<django.db.models.fields.related.ManyRelatedManager at 0x10d014c50>
從上面的代碼中的后兩行輸出我們可以看到,User的這兩個多對多屬性,都是關於ManyRelatedManager的引用。因此我們可以像對所有對多關系屬性一樣使用:
- 直接將一個列表賦值給該屬性:
es.groups = [group_list] es.user_permissions = [permission_list]
- 使用add方法將對象加入:
es.groups.add(group, group, ...) es.user_permissions.add(permission, permission, ...)
- 使用remove方法將對象刪除:
es.groups.remove(group, group, ...) es.user_permissions.remove(permission, permission, ...)
- 使用clear方法將所有對象刪除:
es.groups.clear() es.user_permissions.clear()
User對象有以下幾個屬性:
- username:字符串類型。必填。30個字符以內。
- first_name:字符串類型。可選。30個字符以內。
- last_name:字符串類型。可選。30個字符以內。
- email:可選。
- password:明文密碼的hash或者是某種元數據。該屬性不應該直接賦值明文密碼,而應該通過set_password()方法進行賦值,在后面有詳細說明TODO。
- is_staff:Boolean類型。用這個來判斷是否用戶可以登錄進入admin site。
- is_active:Boolean類型。用來判斷該用戶是否是可用激活狀態。在刪除一個帳戶的時候,可以選擇將這個屬性置為False,而不是真正刪除。這樣如果應用有外鍵引用到這個用戶,外鍵就不會被破壞。
- is_superuser:Boolean類型。該屬性用來表示該用戶擁有所有的許可,而無需明確的賦予給他。
- last_login:datetime類型。最近一次登陸時間。
- date_joined:datetime類型。創建時間。
除了DjangoModel對象的通用方法之外,User對象有以下特有方法:
- is_anonymous():
永遠返回False.用來將User對象和AnonymousUser(未登錄的匿名用戶)對象作區分用的識別方法。通常,最好用is_authenticated()方法。 - is_authenticated():
永遠返回True。該方法不代表該用戶有任何的許可,也不代表該用戶是active的,而只是表明該用戶提供了正確的username和password。 - get_full_name():
返回一個字符串,是first_name和last_name中間加一個空格組成。 - set_password(raw_password):
調用該方法時候傳入一個明文密碼,該方法會進行hash轉換。該方法調用之后並不會保存User對象。 - check_password(raw_password):
如果傳入的明文密碼是正確的返回True。該方法和set_password是一對,也會考慮hash轉換。 - set_unusable_password():
將用戶設置為沒有密碼的狀態。調用該方法后,check_password()方法將會永遠返回false。但是如果,調用set_password()方法重新設置密碼后,該方法將會失效,has_usable_password()也會返回True。 - has_usable_password():
在調用set_unusable_password()方法之后,該方法返回False,正常情況下返回True。 - get_group_permissions(obj=None):
返回該用戶通過組所擁有的許可(字符串列表每一個代表一個許可)。obj如果指定,將會返回關於該對象的許可,而不是模型。 - get_all_permissions(obj=None):
返回該用戶所擁有的所有的許可,包括通過組的和通過用戶賦予的許可。 - has_perm(perm,obj=None):
如果用戶有傳入的perm,則返回True。perm可以是一個格式為:'<app label>.<permission codename>'的字符串。如果User對象為inactive,該方法永遠返回False。和前面一樣,如果傳入obj,則判斷該用戶對於這個對象是否有這個許可。 - has_perms(perm_list,obj=None):
和has_perm一樣,不同的地方是第一個參數是一個perm列表,只有用戶擁有傳入的每一個perm,返回值才是True。 - has_module_perms(package_name):
傳入的是Django app label,按照'<app label>.<permission codename>'格式。當用戶擁有該app label下面所有的perm時,返回值為True。如果用戶為inactive,返回值永遠為False。 - email_user(subject,message,from_email=None):
發送一封郵件給這個用戶,依靠的當然是該用戶的email屬性。如果from_email不提供的話,Django會使用settings中的DEFAULT_FROM_EMAIL發送。 - get_profile():
返回一個和Site相關的profile對象,用來存儲額外的用戶信息。這個返回值會在另一片博文中詳細描述。
User對象的Manager,UserManager:
和其他的模型一樣,User模型類的objects屬性也是一個Manager對象,但是User的Manager對象是自定義的,增加了一些方法:
- create_user(username,email=None,password=None):該方法創建保存一個is_active=True的User對象並返回。username不能夠為空,否則拋出ValueError異常。email和password都是可選的。email的domain部分會被自動轉變為小寫。password如果沒有提供,則User對象的set_unusable_password()方法將會被調用。
- make_random_password(length=10,allowed_chars='abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789'):該方法返回一個給定長度和允許字符集的密碼。其中默認的allowed_chars有一些字符沒有,比如i,l等等。
