本文記錄使用django自帶的認證系統實現自定義的權限管理系統,包含組權限、用戶權限等實現。
0x01. django認證系統
django自帶的認證系統能夠很好的實現如登錄、登出、創建用戶、創建超級用戶、修改密碼等復雜操作,并且實現了用戶組、組權限、用戶權限等復雜結構,使用自帶的認證系統就能幫助我們實現自定義的權限系統達到權限控制的目的。
0x02. 認證系統User對象
User對象顧名思義即為表示用戶的對象,里面的屬性包括:
創建好對象后,django會自動生成表,表名為auth_user
,包含以上字段。具體的api文檔如下所示:
class models.User
User 對象具有如下字段:
username
必選。少于等于30個字符。 用戶名可以包含字母、數字、_、@、+、.和- 字符。
first_name
可選。 少于等于30個字符。
last_name
可選。少于30個字符。
email
可選。郵箱地址。
password
必選。 密碼的哈希及元數據。(Django 不保存原始密碼)。原始密碼可以無限長而且可以包含任意字符。參見密碼相關的文檔。
groups
與Group 之間的多對多關系。
user_permissions
與Permission 之間的多對多關系。
is_staff
布爾值。指示用戶是否可以訪問Admin 站點。
is_active
布爾值。指示用戶的賬號是否激活。
is_superuser
布爾值。只是這個用戶擁有所有的權限而不需要給他們分配明確的權限。
last_login
用戶最后一次登錄的時間。
date_joined
賬戶創建的時間。當賬號創建時,默認設置為當前的date/time。
一般在注冊操作中會用到該方法,實現注冊一個用戶,用到的函數是User.objects.create_user()
,在新建用戶的時候需要判斷用戶是否存在,我的實現方式是,User.objects.get(username=xxx)
去獲取一個用戶User對象,用try except
實現,如果用戶不存在則拋出User.DoesNotExist
異常,在這個異常中進行創建用戶的操作。具體代碼如下:
# 注冊操作from django.contrib.auth.models import Usertry: User.objects.get(username=username) data = {'code': '-7', 'info': u'用戶已存在'}except User.DoesNotExist: user = User.objects.create_user(username, email, password) if user is not None: user.is_active = False user.save()
該過程中密碼字段會自動加密存儲。無需關注過多細節。
0x03. 登錄登出用戶
創建好用戶后,就是登錄及登出了,django認證系統提供了login()
及logout()
函數,能夠自動登錄登出,并且修改session值,非常方便。驗證用戶身份使用
新聞熱點
疑難解答