Vue實現登入
在登陸元件中找到登陸按鈕,繫結點選事件
<button class="login_btn" @click="loginhander">登入</button>
在methods中請求後端
export default { name: 'Login', data(){ return { login_type: 0, remember:false, // 記住密碼 username:"", password:"", } }, methods:{ // 登入 loginhander(){ this.$axios.post("http://127.0.0.1:8000/users/authorizations/",{"username":this.username,"password":this.password}).then(response=>{ console.log(response.data) }).catch(error=>{ console.log(error) }) } }, };
前端儲存jwt
可以將JWT儲存在cookie中,也可以儲存在瀏覽器的本地儲存裡,我們儲存在瀏覽器本地儲存中
瀏覽器的本地儲存提供了sessionStorage 和 localStorage 兩種,從屬於window物件:
- sessionStorage 瀏覽器關閉即失效
- localStorage 長期有效
使用方法
sessionStorage.變數名 = 變數值 // 儲存資料 sessionStorage.setItem("變數名","變數值") // 儲存資料 sessionStorage.變數名 // 讀取資料 sessionStorage.getItem("變數名") // 讀取資料 sessionStorage.removeItem("變數名") // 清除單個數據 sessionStorage.clear() // 清除所有sessionStorage儲存的資料 localStorage.變數名 = 變數值 // 儲存資料 localStorage.setItem("變數名","變數值") // 儲存資料 localStorage.變數名 // 讀取資料 localStorage.getItem("變數名") // 讀取資料 localStorage.removeItem("變數名") // 清除單個數據 localStorage.clear() // 清除所有sessionStorage儲存的資料
登陸元件程式碼Login.vue
// 使用瀏覽器本地儲存儲存token if (this.remember) { // 記住登入 sessionStorage.clear(); localStorage.token = response.data.token; } else { // 未記住登入 localStorage.clear(); sessionStorage.token = response.data.token; } // 頁面跳轉回到上一個頁面 也可以使用 this.$router.push("/") 回到首頁 this.$router.go(-1)
預設的返回值僅有token,我們還需在返回值中增加username和id,方便在客戶端頁面中顯示當前登陸使用者
通過修改該檢視的返回值可以完成我們的需求。
在user/utils.py 中,建立
def jwt_response_payload_handler(token, user=None, request=None):
"""
自定義jwt認證成功返回資料
"""
return {
'token': token,
'id': user.id,
'username': user.username
}
修改settings/dev.py配置檔案
# JWT
JWT_AUTH = {
'JWT_EXPIRATION_DELTA': datetime.timedelta(days=1),
'JWT_RESPONSE_PAYLOAD_HANDLER': 'users.utils.jwt_response_payload_handler',
}
登陸元件程式碼Login.vue
// 使用瀏覽器本地儲存儲存token
if (this.remember) {
// 記住登入
sessionStorage.clear();
localStorage.token = response.data.token;
localStorage.id = response.data.id;
localStorage.username = response.data.username;
} else {
// 未記住登入
localStorage.clear();
sessionStorage.token = response.data.token;
sessionStorage.id = response.data.id;
sessionStorage.username = response.data.username;
}
//登入成功之後,提示使用者,然後使用者點選確定,就跳轉到首頁
let ths = this;
this.$alert('登入成功!','路飛學城',{ #element-ui的alert需要三個引數,提示資訊,標題,{callback回撥函式}
callback(){
ths.$router.push('/');
}
})
多條件登入
JWT擴充套件的登入檢視,在收到使用者名稱與密碼時,也是呼叫Django的認證系統中提供的authenticate()來檢查使用者名稱與密碼是否正確。
可以通過修改Django認證系統的認證後端(主要是authenticate方法)來支援登入賬號既可以是使用者名稱也可以是手機號。
官方說:修改Django認證系統的認證後端需要繼承django.contrib.auth.backends.ModelBackend,並重寫authenticate方法。
authenticate(self, request, username=None, password=None, **kwargs)
方法的引數說明:
- request 本次認證的請求物件
- username 本次認證提供的使用者賬號
- password 本次認證提供的密碼
我們想要讓使用者既可以以使用者名稱登入,也可以以手機號登入,那麼對於authenticate方法而言,username引數即表示使用者名稱或者手機號。
重寫authenticate方法的思路:
- 根據username引數查詢使用者User物件,username引數可能是使用者名稱,也可能是手機號
- 若查詢到User物件,呼叫User物件的check_password方法檢查密碼是否正確
在users應用下建立一個utils.py中編寫:
def get_user_by_account(account):
"""
根據帳號獲取user物件
:param account: 賬號,可以是使用者名稱,也可以是手機號
:return: User物件 或者 None
"""
try:
user = models.User.objects.filter(Q(username=account)|Q(mobile=account)).first()
except models.User.DoesNotExist:
return None
else:
return user
from . import models
from django.db.models import Q
from django.contrib.auth.backends import ModelBackend
class UsernameMobileAuthBackend(ModelBackend):
"""
自定義使用者名稱或手機號認證
"""
def authenticate(self, request, username=None, password=None, **kwargs):
user = get_user_by_account(username)
#if user is not None and user.check_password(password) :
if user is not None and user.check_password(password) and user.is_authenticated:
#user.is_authenticated是看他有沒有許可權的,這裡可以不加上它
return user
在配置檔案settings/dev.py中告知Django使用自定義的認證後端
AUTHENTICATION_BACKENDS = [
'users.utils.UsernameMobileAuthBackend',
]
以上就實現了通過使用者名稱或者手機號的一個多條件登入。
跳轉到首頁之後,我們需要顯示的不再是登入註冊按鈕,而是顯示購物車,個人中心等內容,