SORU
5 HAZİRAN 2009, Cuma


Nasıl django kullanıcı oturum kapatma zorlamak için?

Belirli koşullar altında django uygulamamı bir kullanıcı adı ile kullanıcı oturum kapatma zorlamak için mümkün olmak istiyorum. İlle açmış geçerli kullanıcı, ama başka bir kullanıcı. Benim görüşüme göre istek yöntemi çıkış yapmak istediğim kullanıcı hakkında herhangi bir oturum bilgi yok.

Django aşinayım.auth ve auth.çıkış yöntemi, ama zaman alıristekbağımsız değişken olarak. Orada bir "django yönlü kullanıcı var eğer çıkmak için" kullanıcı adı? Ya da kendi çıkış benim sql roll gerekiyor?

CEVAP
20 ŞUBAT 2011, Pazar


Harold cevabı bu özel durumda çalışmasına rağmen, en az iki önemli konu görüyorum:

  1. Bu çözüm, tek bir veritabanı session engine ile kullanılabilir. Diğer durumlar (önbellek, dosya, çerez) Session model kullanılacaktır.
  2. Veritabanında oturumları ve kullanıcı sayısı büyüdükçe, bu çok verimsiz olur.

Bu sorunları çözmek için, sorun başka bir yaklaşım öneriyorum. Fikri bir yerde kullanıcı belirli bir oturum için oturum tarihini, ve bir kullanıcı giriş yapmış olmak istediğiniz son kez saklamak için.

Ne zaman birileri varsa giriş tarihi ise siteye girişdaha düşüktarih buradan günlük,-çıkış gücü kullanıcı. Dan dediği gibi, sitenize bir sonraki istekte bir kullanıcı hemen oturum arasında pratik bir fark yok.

Şimdi, diyelim ki bu çözüm, olası bir uygulama için bkzdjango 1.3b1. Üç adımda

1. oturumda son giriş tarihi saklayın

Neyse ki, Django auth sistemi signal user_logged_in adlı bir sunar. Sadece bu sinyalleri kayıt ve oturumda geçerli tarih kaydetmek zorunda. models.py: alt

from django.contrib.auth.signals import user_logged_in
from datetime import datetime

def update_session_last_login(sender, user=user, request=request, **kwargs):
    if request:
        request.session['LAST_LOGIN_DATE'] = datetime.now()
user_logged_in.connect(update_session_last_login)

2. bir kullanıcı için güç bir çıkış isteği

Biz sadece bir alan ve User modeli için bir yöntem eklemek gerekir. (user profiles, model inheritance, vb.) elde etmek için birden fazla yol var artıları ve eksileri ile her biri.

Eğer bu çözüm için kolaylık olması için, model devralma burada kullanacağım,, 29* *unutma.

from django.contrib.auth.models import User
from django.db import models
from datetime import datetime

class MyUser(User):
    force_logout_date = models.DateTimeField(null=True, blank=True)

    def force_logout(self):
        self.force_logout_date = datetime.now()
        self.save()

Eğer kullanıcı oturum kapatma zorlamak istiyorsanız o zaman johndoe mecbursun:

from myapp.models import MyUser
MyUser.objects.get(username='johndoe').force_logout()

3. erişim denetimi uygular

En iyi şekilde burada dan önerilen middleware kullanmaktır. Bu katman koymak gerekir, bu yüzden request.user erişirlersonraMIDDLEWARE_CLASSES ayarı 'django.contrib.auth.middleware.AuthenticationMiddleware'.

from django.contrib.auth import logout

class ForceLogoutMiddleware(object):
    def process_request(self, request):
        if request.user.is_authenticated() and request.user.force_logout_date and \
           request.session['LAST_LOGIN_DATE'] < request.user.force_logout_date:
            logout(request)

Bu şekilde olması gerek.


Notlar

  • Kullanıcılar için ek bir depolama alanı performans ima farkında olun. Model kalıtım kullanarak JOIN ekstra katacak. Kullanıcı profilleri kullanarak, fazladan bir sorgu ekleyin. Doğrudan User değiştirme en iyi şekilde performans bilge, ama yine de hairy topic.
  • Eğer varolan bir sitede bu çözümü dağıtmak eğer, muhtemelen 'LAST_LOGIN_DATE' anahtar var olmaz, varolan oturumları ile bazı sorun var. Biraz bu durum ile başa çıkmak için katman kodu uyarlayabilirsiniz :

    from django.contrib.auth import logout
    
    class ForceLogoutMiddleware(object):
        def process_request(self, request):
            if request.user.is_authenticated() and request.user.force_logout_date and \
               ( 'LAST_LOGIN_DATE' not in request.session or \
                 request.session['LAST_LOGIN_DATE'] < request.user.force_logout_date ):
                logout(request)
    
  • Django 1.2.x user_logged_in sinyal yok. login işlevi geçersiz kılma geri:

    from django.contrib.auth import login as dj_login
    from datetime import datetime
    
    def login(request, user):
        dj_login(request, user)
        request.session['LAST_LOGIN_DATE'] = datetime.now()
    

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ash100HD

    Ash100HD

    29 EKİM 2011
  • BigDawsVlogs

    BigDawsVlogs

    17 HAZİRAN 2013
  • Lamarr Wilson

    Lamarr Wilso

    27 Aralık 2008