Django—內置用戶權限管理


內置用戶權限管理

對於注冊、登錄、驗證等功能我們可以自己編寫用戶管理應用,但Django也有一個內置的用戶權限管理系統。也是很強大的。

在哪可以看到?

關於用戶的信息都存放在這個表中。

 

auth模塊

from django.contrib import auth

其中有幾個常用的方法:

authenticate()

提供了用戶認證功能,即驗證用戶名以及密碼是否正確,一般需要username 、password兩個關鍵字參數。

如果認證成功(用戶名和密碼正確有效),便會返回一個 User 實例對象,否則返回None。

用法:

user = auth.authenticate(username=user, password=pwd)  #進行認證

login(HttpRequest, user)

該函數接受一個HttpRequest對象,以及一個經過認證的User實例對象(也就是 authenticate方法返回的User對象)

該函數實現一個用戶登錄的功能。會在后端為該用戶生成相關session數據

通常 login() 與 authenticate() 一起配合使用。

用法:

def login(request):
    if request.method == 'POST':
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')

        # 通過內置驗證
        user = auth.authenticate(username=user, password=pwd)

        if user:
            # 將登陸的信息封裝到request.user,包括session
            auth.login(request, user)
            return redirect('/index/')

    return render(request, "login.html")

這樣我們就可以在其他地方拿到用戶相關數據

def index(request):
    name = request.user.username  # 通過user拿到相關信息
    return render(request, 'index.html', {'user': name})

logout(request) 

該函數接受一個HttpRequest對象,無返回值。

當調用該函數時,當前請求的session信息會全部清除。該用戶即使沒有登錄,使用該函數也不會報錯。

用法:

def logout(request):
    auth.logout(request)  # 清除當前用戶的session信息
    return redirect('/login/')

is_authenticated()

判斷用戶是否登錄,登錄返回True,否則返回False。

用法:

def my_view(request):
  if not request.user.is_authenticated():  # 如果登錄失敗
    return redirect('%s?next=%s' % (settings.LOGIN_URL, request.path))

login_requierd()

在執行函數之前先進行登錄校檢,是一個裝飾器

用法:

from django.contrib.auth.decorators import login_required
      
@login_required()   #  如果登錄了就執行 index 視圖函數
def index(request):
    cd = request.user.username
    return render(request, 'index.html', {'user': cd})

若用戶沒有登錄,則會跳轉到django默認的 登錄URL '/accounts/login/ ' 並傳遞當前訪問url的絕對路徑 (登陸成功后,會重定向到該路徑)。

如果需要自定義登錄的URL,則需要在settings.py文件中通過LOGIN_URL進行修改

示例:

LOGIN_URL = '/login/'  # 這里配置成你項目登錄頁面的URL

create_user()

auth 提供的一個創建新用戶的方法,需要提供必要參數(username、password)等。

用法:

from django.contrib.auth.models import User


def register(request):
    # 內置注冊普通 用戶
    User.objects.create_user(username='gz', password=123456)
    return HttpResponse("注冊成功")

當然我們也可以根據表單結合使用

create_superuser()

auth 提供的一個創建新的超級用戶的方法,需要提供必要參數(username、password)等。

用法:

from django.contrib.auth.models import User
user = User.objects.create_superuser(username='用戶名',password='密碼',email='郵箱',...)

check_password(password)

auth 提供的一個檢查密碼是否正確的方法,需要提供當前請求用戶的密碼。

密碼正確返回True,否則返回False。

用法:

ok = user.check_password('密碼')

set_password(password)

auth 提供的一個修改密碼的方法,接收 要設置的新密碼 作為參數。

注意:設置完一定要調用用戶對象的save方法!!!

用法:

user.set_password(password='xxxxx')
user.save()  # 不要忘了保存

擴展默認的auth_user表

內置的User表,就那些固定的字段。我想添加自己的字段怎么辦?

我們可以通過繼承內置的 AbstractUser 類,來定義一個自己的Model類。

from django.contrib.auth.models import User, AbstractUser

# 通過繼承  擴展  
class UserInfo(AbstractUser):
    phone = models.IntegerField()
    addr = models.CharField(max_length=30)

注意:

如果擴展了內置的auth_user表之后,一定要在settings.py中告訴Django,我現在使用我新定義的UserInfo表來做用戶認證。寫法如下:

# 引用Django自帶的User表,繼承使用時需要設置
AUTH_USER_MODEL = "app名.UserInfo"

再次注意:

一旦我們指定了新的認證系統所使用的表,我們就需要重新在數據庫中創建該表,而不能繼續使用原來默認的auth_user表了

 疑問:

如果我們擴展了表之后,那之前的用到內置函數可以用嗎?

(1)擴展表之后,表名就是models.py里定義的表名

(2)其他關於auth的方法,不影響。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM