Django Hoe voorkomen dat meerdere gebruikers inloggen met dezelfde inloggegevens

Ik ontwikkel een Django-applicatie met de django-authenticatiemodule en wil voorkomen dat er meerdere aanmeldingen plaatsvinden met dezelfde gebruikersnaam en hetzelfde wachtwoord.

Het moet meerdere aanmeldingen op verschillende machines voorkomen met dezelfde gebruikersnaam en hetzelfde wachtwoord. Hoe bereik ik dit in Django?

We moeten de dingen in gedachten houden:

  1. Als de gebruiker de browser sluit zonder uit te loggen
  2. Als de sessie wordt onderbroken
6

3 antwoord

U kunt dit proberen, het logt de eerste gebruiker uit en logt in op de tweede. Voeg middleware.py toe aan uw app-directory (zelfde niveau als modellen, dataweergaven, enz.) En voeg deze code toe. Handig als dezelfde persoon meer dan één apparaat gebruikt. Zorg ervoor dat u dit toevoegt aan uw middleware-klassen: '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)
3
toegevoegd

Out of the box, Django doesn't provide you with a way to prevent concurrent sessions for the same user account, and that isn't a trivial thing to do. However, here's another question with some suggestions about how you might make this happen: How can I detect multiple logins into a Django web application from different locations?

2
toegevoegd

ik los het probleem op met een nieuw model, een aangepaste decorateur en een aangepaste inlogpagina

1) Ik heb een extra model gemaakt voor gebruikers, bijvoorbeeld:

class SessionKey(models.Model):
    user = models.OneToOneField(User,primary_key=True)
    key = models.CharField(max_length=255)

2) i created custom decorator to check session key is equal or not last key. i changed the original source code 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) op de aangepaste inlogpagina heb ik de sessiesleutel bijgewerkt. de laatste login werkt de opgeslagen sessiesleutel altijd bij.

eindelijk, in de views, bel ik mijn decorateur

from users.decorators import unique_login_required
@unique_login_required
def index(request):
...
0
toegevoegd