2011-12-07 10 views
3

django認証モジュールを使用してDjangoアプリケーションを開発しており、同じユーザー名とパスワードを使用して複数のログインを防止します。Django同じ資格情報を使用して複数のユーザーがログインするのを防ぐ方法

同じユーザー名とパスワードを使用する異なるマシン上での複数のログインを防止する必要があります。これをDjangoでどうやって達成するのですか?

  1. ユーザーが箱から出してセッションがタイムアウト

答えて

2

は、Djangoはない場合

  • をログアウトせずにブラウザを閉じた場合:

    は、私たちは心の中で物事を次のよう維持する必要があります同じユーザーアカウントに対して同時セッションを防止する方法を提供します。これは簡単なことではありません。しかし、ここであなたはこれを実現するかもしれない方法についていくつかの提案を持つ別の質問です:How can I detect multiple logins into a Django web application from different locations?

  • 0

    私は新しいモデル、カスタムデコレータとカスタムログインページ

    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): 
    ... 
    
    2

    私のデコレータを呼び出し、それが第二の最初のユーザとログをログアウトします。アプリケーションディレクトリ(モデル、ビューなどと同じレベル)に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) 
    
    関連する問題