最近由於要畢業了寫**做畢設,然後還在實習發現已經好久都沒有寫部落格了。今天由於工作需求,需要用django實現單使用者登入。大概意思就是跟qq一樣的效果,每個賬號只能乙個地方登入使用,限制賬號的登入次數。由於用的是django自帶的認證,然後校驗使用者是否登入其實就是通過session實現的。下面就簡單分享一下怎麼實現的吧。
在做使用者登入認證的時候django自帶的有is_authenticated()方法。下面就是乙個簡單的認證過程。
if request.user.is_authenticated(): #現在步入正題,講一下具體實現流程吧。我們在做使用者登入的時候一般會擴充套件django自帶的user表,當然方法一般有幾種,你可以繼承abstractuser表然後寫入自己想要的字段,還可以單獨建個表然後跟user表建立一對一的關係,具體的實現這裡就不多加描述了。判斷是否登入
return redirect('
/index/')
else
:
return redirect('
/accounts/login/
')
我採用的是單獨建立乙個使用者資訊表於user表進行一對一關聯,在使用者表裡面增加乙個session_key欄位用於存最新使用者登入的session_key。每次我們登入就取出這個值進行判斷,如果裡面沒有值,表示使用者沒有登入就可以走正常的登入流程。如果裡面有值,說明代表的是前面使用者登入留下的session_key,我們就先在session表裡面刪除掉這個記錄,讓上乙個登入使用者的session失效,然後登入的時候再把最新登入生成的session_key更新到使用者資訊表裡面,用作下乙個校驗。這樣就能簡單快捷的實現django的單使用者登入了。
核心**截圖:
具體實現**如下:
from django.shortcuts importredirect
from django.views.decorators.cache import
never_cache
from django.views.decorators.csrf import
csrf_exempt
from django.contrib.auth import
login as auth_login, authenticate
使用者資訊表
@csrf_exempt
@never_cache
deflogin(request):
ifrequest.user.is_authenticated():
return redirect('
/index/')
else
:
if request.method == "
post":
username = request.post.get("
username")
password = request.post.get("
password")
authenticated_user = authenticate(username=username, password=password)
ifauthenticated_user:
#單使用者登入
user_obj = ucenter.objects.filter(userid=authenticated_user) #
找到登入的user物件
is_session_key = user_obj.first().session_key #
獲取登入物件的session_key
if is_session_key: #
使用者已登入
request.session.delete(is_session_key) #
刪除登入前面登入使用者的session_key
auth_login(request, authenticated_user) #
使用者資訊存入session
user_obj.update(session_key=request.session.session_key) #
更新新登入user的session_key
return redirect('
/index/')
else
:
return redirect('
/accounts/login/
')
單使用者登入
目的 乙個賬號只能在乙個地方登入,不能同時登入 有兩種處理邏輯 1.a登入後,b不能使用同樣的賬戶進行登入 後台邏輯定義 使用者資料表多新增乙個字段,預設為false,每次使用者發起登入,檢測是否為false,是則可以登入,並設定為true,如果為true,則提示使用者已登入,請換個賬號 2.a登入...
shiro單使用者登入實現
1.需求 賬號同一時間只能在一處登入 將之前的使用者踢出 shiro實現策略 獲取當前使用者session列表,直接刪除該使用者的其他登入資訊import org.apache.shiro.session.mgt.eis.sessiondao autowired private sessiondao...
Shiro單使用者登入
有這樣乙個需求,兩地同時使用乙個賬號登入,需要將先登入的使用者的session刪除 使用者登入時判斷是否之前改賬號在別的地方登入 若沒有登入,直接進行登入 若有登入,則找到登入的session,給該session做個標記 當之前登入的使用者再次進行操作時,判斷其是否有標記,有則刪除其session,...