django認証モジュールを使用してDjangoアプリケーションを開発しており、同じユーザー名とパスワードを使用して複数のログインを防止します。Django同じ資格情報を使用して複数のユーザーがログインするのを防ぐ方法
同じユーザー名とパスワードを使用する異なるマシン上での複数のログインを防止する必要があります。これをDjangoでどうやって達成するのですか?
- ユーザーが箱から出してセッションがタイムアウト
django認証モジュールを使用してDjangoアプリケーションを開発しており、同じユーザー名とパスワードを使用して複数のログインを防止します。Django同じ資格情報を使用して複数のユーザーがログインするのを防ぐ方法
同じユーザー名とパスワードを使用する異なるマシン上での複数のログインを防止する必要があります。これをDjangoでどうやって達成するのですか?
は、Djangoはない場合
は、私たちは心の中で物事を次のよう維持する必要があります同じユーザーアカウントに対して同時セッションを防止する方法を提供します。これは簡単なことではありません。しかし、ここであなたはこれを実現するかもしれない方法についていくつかの提案を持つ別の質問です:How can I detect multiple logins into a Django web application from different locations?
私は新しいモデル、カスタムデコレータとカスタムログインページ
1の問題を解決するには)私は、ユーザーのための追加モデルを作成しました例えば:私は、セッション鍵をチェックするために、カスタムデコレータを作成
class SessionKey(models.Model):
user = models.OneToOneField(User,primary_key=True)
key = models.CharField(max_length=255)
2)が等しいかどうか最後のキーです。 私はカスタムログインページで元のソースコードdjango decorators
from functools import wraps
from django.conf import settings
from django.utils.decorators import available_attrs
from django.contrib.auth.decorators import login_required
from django.shortcuts import resolve_url
from users.models import SessionKey #my additional model
def unique_login_required(view_func):
@wraps(view_func, assigned=available_attrs(view_func))
def _wrapped_view(request, *args, **kwargs):
r = False
...
#check session key is equal to last one
...
if r:
return view_func(request, *args, **kwargs)
else:
from django.contrib.auth.views import redirect_to_login
path = request.build_absolute_uri()
resolved_login_url = resolve_url(settings.LOGIN_URL)
return redirect_to_login(path,resolved_login_url)
return _wrapped_view
3)を変更し、私は、セッションキーを更新しました。最後のログインは常に、保存されたセッションキーを更新します。
は最終的に、ビューでは、私はあなたがこれを試すことが
from users.decorators import unique_login_required
@unique_login_required
def index(request):
...
私のデコレータを呼び出し、それが第二の最初のユーザとログをログアウトします。アプリケーションディレクトリ(モデル、ビューなどと同じレベル)にmiddleware.pyを追加し、このコードを追加してください。同じ人が複数のデバイスを使用している場合に便利です。これをミドルウェアクラスに追加してください: 'myapp.middleware.UserRestrict'、
class UserRestrict(object):
def process_request(self, request):
"""
Checks if different session exists for user and deletes it.
"""
if request.user.is_authenticated():
cache = get_cache('default')
cache_timeout = 86400
cache_key = "user_pk_%s_restrict" % request.user.pk
cache_value = cache.get(cache_key)
if cache_value is not None:
if request.session.session_key != cache_value:
engine = import_module(settings.SESSION_ENGINE)
session = engine.SessionStore(session_key=cache_value)
session.delete()
cache.set(cache_key, request.session.session_key,
cache_timeout)
else:
cache.set(cache_key, request.session.session_key, cache_timeout)