2010-12-07 3 views
2

Existe-t-il un moyen de limiter le nombre de sessions dans l'application Ruby on Rails (j'utilise Authlogic pour l'authentification)?Rails et Authlogic: Autoriser une seule session par utilisateur?

Je voudrais autoriser seulement 1 session par compte d'utilisateur. Lorsque le même utilisateur se connecte à un autre ordinateur, la session précédente doit être expirée/invalidée.

Je pensais à stocker les données de session dans la base de données, puis à les supprimer lors de la création d'une nouvelle instance de session, mais il y a probablement un moyen plus facile? (option de configuration)

Répondre

0

Je fais exactement ce dont vous parlez, attribuez un identifiant de session à chaque session uniq, stockez cet identifiant dans un cookie et les données de session associées dans un tableau. Fonctionne bien. Mon but n'était pas de limiter les utilisateurs à une seule session, mais plutôt de garder le côté serveur des variables de session pour éviter la manipulation de l'utilisateur.

2

Je viens de rencontrer dans une solution possible, si vous rétablissez presistence vous Jeton pouvez obtenir le comportement souhaité:

class UserSession < Authlogic::Session::Base 
    before_create :reset_persistence_token 

    def reset_persistence_token 
    record.reset_persistence_token 
    end 
end 

En faisant cela, de vieilles sessions pour un utilisateur qui se logue sont invalidés.

Plus tôt, je mis en œuvre comme vous l'avez mentionné: ajouter un champ session_key à la table des utilisateurs et assurez-vous que le session_id courant est stocké pour l'utilisateur lors de la connexion:

class UserSession < Authlogic::Session::Base 
    after_save :set_session_key 
    def set_session_key 
    record.session_key = controller.session.session_id 
    end 
end 

Ensuite, dans le contrôleur générique faire quelque chose comme pour expulser un utilisateur lorsque quelqu'un d'autre s'est connecté avec le même compte:

before_filter :check_for_simultaneous_login 

def check_for_simultaneous_login 
    # Prevent simultaneous logins 
    if @current_user && @current_user.session_key != session[:session_id] 
    flash[:notice] = t('simultaneous_logins_detected') 
    current_user_session.destroy 
    redirect_to login_url 
    end 
end 
Questions connexes