Bonjour,

J'ai beau chercher je ne trouve pas de solutions qui me convienne alors je m'adresse a vous : je souhaiterais afficher dans une vue la liste des utilisateurs connectés à mon appli afin de pouvoir les deconnecter manuellement (en tant qu'admin) si besoin.

J'ai passé les sessions sur 'database' car je pense que c'est le seul moyen pour ce que je cherche a faire.

J'étais parti pour afficher betement ma table sessions ce qui me parraissait convenir mais je me suis vite rendu compte que certaines lignes étaient des "lignes fantomes". Surement des utilisateurs qui n'ont pas utilisés le bouton deconnexion ou reconnectés plusieurs fois. Cependant les sessions ne se suppriment pas au bout du timming de mes sessions.
Je me retrouve avec des lignes parasites sur ma table donc inexploitable.

Auriez vous une idée ou une idée de comment proceder ?

Merci d'avance.

7 réponses


Axis
Auteur
Réponse acceptée

Merci de ta réponse Alex, du coup je filtre sur ma table session pas rapport à ma variable env('TIME_SESSION') du coup j'exclu mes ligne résiduelles. Elle resteront tant pis.

Salut,

Pour ça plusieurs éléments à améliorer. Premièrement tu dois passer les sessions sur database, deuxième dans ta table sessions, tu dois rajouter un champ user_id en relation avec ta table users.

Ensuite il te faut créer un modèle pour les sessions, comme celui-ci :

<?php

use Auth;
use Session;
use Carbon\Carbon;

class Session extends \Eloquent {

    protected $hidden = ['payload'];

    /**
     * The database table used by the model.
     *
     * @var string
     */
    public $table = 'sessions';

    public $timestamps = false;

    /**
     * Returns the user that belongs to this entry.
     */
    public function user()
    {
        return $this->belongsTo('User');
    }

    /**
     * Returns all the guest users.
     *
     * @param  $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeGuests($query)
    {
        return $query->whereNull('user_id')->where('last_activity', '>=', strtotime(Carbon::now()->subMinutes(Config::get('custom.activity_limit'))));
    }

    /**
     * Returns all the registered users.
     *
     * @param  $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeRegistered($query)
    {
        return $query->whereNotNull('user_id')->where('last_activity', '>=', strtotime(Carbon::now()->subMinutes(Config::get('custom.activity_limit'))))->with('user');
    }

    /**
     * Updates the session of the current user.
     *
     * @param  $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeUpdateCurrent($query)
    {
        return $query->where('id', Session::getId())->update([
            'user_id' => ! empty(Auth::user()) ? Auth::id() : null
        ]);
    }

}

Code trouvé sur laracasts

Il te faudra ensuite créer un listener pour l'évènement de connexion pour rajouter la fonction de mise à jour de la table ;)

Autrement tu as ce package :

https://github.com/thomastkim/laravel-online-users

Axis
Auteur

Salut SquallX et merci pour ta réponse.

J'ai déjà fait plus ou moins ce code en passant les sessions en db mais ce qui me gène ce sont les lignes résiduelles qui restent sur la table sessions.

Par exemple aujourd'hui en me connectant à mon appli en local pour la 1ere fois de la journée je me retrouve avec 7 lignes dans ma table alors que je devrais en avoir une seule... Quelqu'un sait d’où ces lignes proviennes et quelle sont les criteres de suppression ?

Il me semble que c'est normal

Axis
Auteur

Pourtant j'ai defini dans app/sessions.php

'lifetime' => env('TIME_SESSION', 30),

Les sessions devraient se supprimer toutes les 30 min si non utilisées non ?

Sinon, pour un site j'ai fait ceci:
cookie connection_token avec une chaine random
dans ta db, tu as genre une table connections avec comme colonnes :
id, connection_token, created_at, updated_at, user_id
connection_token, le cookie (différent pour chaque connexion)
created_at, la connexion
updated_at, dernière chose effectuée
user_id, l'id de l'utilisateur

A chaque page, tu regardes si y'a un enregistrement dans la table qui correspond au connection_token:
Si oui => si l'utilisateur est connecté :
=> si l'user_id correspond : tu updates
=> si l'user_id ne corresspond pas : tu supprimes l'enregistrement est déconnectes
=> si l'utilisateur est déconnecté : tu supprimes l'enregistrement
Si non => si l'utilisateur est connecté : tu le déconnectes
=> si l'utilisateur est déconnecté : tu ne fais rien

Tu as juste à générer un token et l'enregistrement à la connexion, et à le supprimer dans les cas au dessus, ou a la déconnexion

J'espere avoir été clair, mais si tu as des questions ;)

De rien, et si tu veux les supprimer vois du côté de cron ;)