Django內置模塊auth實現認證功能代碼


auth 模塊的知識點,

一,用戶認證

1,創建超級用戶(此步之所以這么做,是用於將用戶名密碼使用命令寫入auth_user表中

(此表不能手工寫,因為password是加密后的字串))

python manage.py createsuperuser

輸入用戶名 xiaohei

輸入郵箱。。。。

輸入密碼xiaohei1234

去數據庫里就能看到auth插件,auth_user表對應的信息了

二,views.py中的核心代碼

2.1導入模塊

from django.contrib import auth

2.2 驗證用戶名和密碼(如果驗證成功返回的是一個user對象,如果驗證失敗則得到一個匿名用戶,此用戶所有屬性是null)

user=auth.authenticate(username=username1,password=pwd)

2.3 將以上通過驗證的user用戶ID保存在session中,供auth中間件使用

auth.login(request,user)

2.4

后面會用於中間件,將user封裝到request.user的屬性中

'django.contrib.auth.middleware.AuthenticationMiddleware',   ------中間件

以下第二步驟代碼歸納如下:

from django.contrib import auth
def login(request):
    if request.method=='POST':
        username1=request.POST.get('username')
        pwd=request.POST.get('password')
        # 如何判斷用戶名和密碼呢
        # 以下是使用auth模塊,去數據庫里查詢用戶信息,驗證是否存在
        user=auth.authenticate(username=username1,password=pwd)
        # 以下語句,其實還是將以上獲得認證的用戶ID保存在SESSION中,#用於后面每個頁面根據此SESSION里的ID,獲取用戶信息驗證,並給auth中間件使用
        auth.login(request,user)
        # 用於以后在調用每個視圖函數前,auth中間件會根據每次訪問視圖前請求所帶的SEESION里面的ID,去數據庫找用戶對像,並將對象保存在request.user屬性中
        # 中間件執行完后,再執行視圖函數
        if user:
            return redirect('/index/')
        else:
            return redirect('/login/')
    return render(request,'login.html')

 

三,需要進行驗證頁面的驗證(使用auth模塊里的裝飾器login_required)

from django.contrib.auth.decorators import login_required
# 以上導入的就是一個裝飾器,用於驗證(我們需要用戶登錄后,才能訪問,否則就跳轉到另外的頁面)
# 這個另外的頁面就默認的是/accounts/login/ 我們也也以自定義要跳轉的地方,在settins.py中LOGIN_URL

# 例如以下頁面需要登錄成功才能訪問
@login_required
def index(request):
    print(request.user.username)
    print('===='*12)
    return render(request,'index.html')

四,如果沒有登錄則跳轉到另外的頁面,這個頁面是可以設置的,

# 這個另外的頁面就默認的是/accounts/login/ 我們也也以自定義要跳轉的地方,在settins.py中LOGIN_URL

settings.py文件中寫以下代碼,指定沒有登錄跳轉到登錄頁面
LOGIN_URL='/login/'

五,用戶注銷

 以下是views.py注銷代碼

from django.contrib.auth.decorators import login_required
# 以上導入的就是一個裝飾器,用於驗證(我們需要用戶登錄后,才能訪問,否則就跳轉到另外的頁面)
# 這個另外的頁面就默認的是/accounts/login/ 我們也也以自定義要跳轉的地方,在settins.py中LOGIN_URL

# 注銷,將session數據都刪除,並且coolies也失效,(即用戶退出登錄,並不銷戶清除數據庫里user記錄哦。。)
def logout(request):
    auth.logout(request)
    return redirect('/login')

六,注冊(創建用戶)

 

# 創建用戶,即注冊
def register(request):
    from django.contrib.auth.models import User
    User.objects.create_user(username='alex',password='alex1234')
    return HttpResponse('o98k')

調用register視圖函數后,即創建成功后,數據庫里的auth_user表就有對應數據了,

 八,DJango的User對象

1,User對象屬性

User 對象屬性:

username, password(必填項)password用哈希算法保存到數據庫

is_staff : 用戶是否擁有網站的管理權限.

is_active : 是否允許用戶登錄, 設置為``False``,可以不用刪除用戶來禁止 用戶登錄

2,User 對象方法

is_authenticated()

如果是真正的 User 對象,返回值恆為 True 。 用於檢查用戶是否已經通過了認證。
通過認證並不意味着用戶擁有任何權限,這個方法甚至也不檢查該用戶是否處於激活狀態,只是表明用戶成功的通過了認證。

這個方法很重要, 在后台用request.user.is_authenticated()判斷用戶是否已經登錄,如果true則可以向前台展示request.user.name

創建用戶

使用 create_user 輔助函數創建用戶:

from django.contrib.auth.models import User
user = User.objects.create_user(username='',password='')

user = User.objects.create_superuser(username='',password='',email='')
## 說明:create_superuser參數必須有username,password,email否則會報錯,
## 創建普通用戶,參數只有username,password即可

檢查密碼:

check_password(passwd)

用戶需要修改密碼的時候,首先要讓其輸入原來的密碼 ,如果給定的值通過了密碼檢查,返回 True

修改密碼

使用 set_password() 來修改密碼

user = User.objects.get(username='')
user.set_password(password='')
user.save()

修改密碼示例:

def register(request):
    from django.contrib.auth.models import User
    # 創建用戶
    user_obj=User.objects.create_user(username='alex6',password='alex1234')
    # 檢查密碼(一般用於修改密碼前驗證)
    ret=user_obj.check_password('alex12345')
    print(ret)  #返回False
    # 修改密碼
    user_obj.set_password('alex12345')
    # 修改后保存
    user_obj.save()
    # 修改后再檢查
    ret=user_obj.check_password('alex12345')
    print (ret)  # 返回True
    return HttpResponse('o98k')

 

 

簡單示例

def sign_up(request):
 
    state = None
    if request.method == 'POST':
 
        password = request.POST.get('password', '')
        repeat_password = request.POST.get('repeat_password', '')
        email=request.POST.get('email', '')
        username = request.POST.get('username', '')
        if User.objects.filter(username=username):
                state = 'user_exist'
        else:
                new_user = User.objects.create_user(username=username, password=password,email=email)
                new_user.save()
 
                return redirect('/book/')
    content = {
        'state': state,
        'user': None,
    }
    return render(request, 'sign_up.html', content) 
注冊示例代碼
@login_required
def set_password(request):
    user = request.user
    state = None
    if request.method == 'POST':
        old_password = request.POST.get('old_password', '')
        new_password = request.POST.get('new_password', '')
        repeat_password = request.POST.get('repeat_password', '')
        if user.check_password(old_password):
            if not new_password:
                state = 'empty'
            elif new_password != repeat_password:
                state = 'repeat_error'
            else:
                user.set_password(new_password)
                user.save()
                return redirect("/log_in/")
        else:
            state = 'password_error'
    content = {
        'user': user,
        'state': state,
    }
    return render(request, 'set_password.html', content)
修改密碼示例

 


免責聲明!

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



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