web-dev-qa-db-ja.com

Djangoでユーザーをログアウトするにはどうすればよいですか?

私たちのDjangoデプロイメントは、LDAPディレクトリの外でまだアクティブなユーザーを見つけることができるかどうかを毎晩チェックします。それらがもう見つからない場合は、非アクティブに設定します。次回ログインしようとすると、これを行うコードは次のとおりです。

def synchronize_users_with_ad(sender, **kwargs):
    """Signal listener which synchronises all active users without a usable
    password against the LDAP directory.  If a user cannot be
    found anymore, he or she is set to “inactive”.
    """
    ldap_connection = LDAPConnection()
    for user in User.objects.filter(is_active=True):
        if not user.has_usable_password() and not existing_in_ldap(user):
            user.is_active = user.is_staff = user.is_superuser = False
            user.save()
            user.groups.clear()
            user.user_permissions.clear()

maintain.connect(synchronize_users_with_ad)

ただし、まだログインしている場合、このセッションは引き続き機能しています。どうすればすぐに無効にすることができますか?セッションミドルウェアのすべての設定はデフォルト値です。

18
Torsten Bronger

を使用してログアウトできます

from Django.contrib.auth import logout

if <your authentication validation logic>:
    logout(request) 

...任意のビュー内から。

16
user2867522

Login_requiredデコレータに加えて、 ser_passes_testデコレータ を使用して、ユーザーがまだアクティブであるかどうかをテストできます。

from Django.contrib.auth import user_passes_test

def is_user_active(user):
    return user.is_active

@user_passes_test(is_user_active, login_url='/your_login')
def your_function(request):
    ....
1
klasske

特定のユーザーのセッションを照会および取得できるセッションバックエンドを使用できます。これらのセッションバックエンドでは、SessionにはUserへの外部キーがあるため、セッションを簡単にクエリできます。

これらのバックエンドを使用すると、ユーザーのすべてのセッションを1行のコードで削除できます。

# log-out a user
user.session_set.all().delete()

免責事項:私はDjango-qsessionsの作者です。