Bonjour,

Ce que je veux

Est ce possible de mettre en place une authentification unique de l'utilisateur ?
càd => qu'un User peux se connecter qu'une seule fois avec son login et MP ne peut pas se connecter ailleur tant que la session est ouverte sur un autre Device.

Merci

7 réponses


agencep
Auteur
Réponse acceptée

Bonjour,
J'ai trouver une solution toute bête pour toute personne qui veut l'utiliser

1- Dans AppController qui permet à l'utilisateur connecté de se mettre a jour dans la BDD directement pour chaque action qu'il fait

public function beforeFilter() {
if (CakeSession::read('Auth.User')) {
            $this->loadModel('User');
            $this->User->id = CakeSession::read('Auth.User.id');
            $this->User->save([
                'last_activity' => date("Y-m-d H:i:s"),
                'is_logged' => true
            ]);
        }
 }

2 - Dans le UsersController

public function login() {
if ($this->request->is('post')) {
  // Vérifier si un autre utilisateur est connecté
  $logged = $this->User->findByEmail($this->request->data['User']['email']); // etant donnée que mon couple authentification est EMAIL

  // Si logged n'est pas vide
    if ($logged) {
        // Si is_logged est TRUE 
        if ($logged['User']['is_logged'] == TRUE) {
        // Verifier la date de la dernière activité
        $diff = $this->getLastActivity($logged['User']['email']);

        // Si la dernière date d'activité est > 10 minutes
        if ($diff >= 10) {
        // modifier is_logged à FALSE
        $this->User->id = $logged['User']['id'];
        $this->User->save(['is_logged' => FALSE]);

        // Supprimer la session dans cake_session pour forcer la déconnexion de l'ancien utilisateur 
        $this->loadModel('Session');
        if ($this->Session->delete($logged['User']['session_id'])) {
        $this->Flash->error("Arrêt de la session précédente, veuillez vous reconnecter");
    }

  } else {
      $this->Flash->error("Vous êtes déja connecter sur un autre prériphérique, veuillez vous déconnecter avant de pouvoir vous connecter de nouveau, Un seul accès par compte est autoriser");
    }
  }else {
    if ($this->Auth->login()) {
    $this->updateLastLogin();
    .........
    }
  }
  }

  }
}
private function getLastActivity($email) {

        $user = $this->User->find('first', [
            'conditions' => ['email' => $email],
            'fields' => ['last_activity', 'is_logged', 'id']
        ]);

        $last_activity = strtotime($user['User']['last_activity']);
        $currentDate = strtotime(date('y-m-d H:i:s'));
        return round(abs($currentDate - $last_activity) / 60,0);
    }

Bonjour, à priori, c'est possible. Dans ta bdd tu rajoutes un champs "Status" (par exemple) à ta table User et lorsque l'utilisateur se connecte la première fois tu updates ce champs à "islog". Auparavant tu créer une identification personnalisée qui dit que si la valeur de ton champs isLog est true, tu n'autorises pas la connection. Et tu n'oublies pas de remettre la valeur du champ à false lorsque l'utilsateur se déconnecte. [A tester mais dans les faits ça devrait marcher]

Hello,

La solution de massadu33 va bel et bien fonctionner.
Seulement, il faut aussi penser aux utilisateurs qui ne cliquent pas sur "Se déconnecter".

agencep
Auteur

Bonjour massadu33,
Oui cette solution est viable, mais si l'utilisateur oublie de se déconnecter, ça va causer un problème, et ce que je cherche est un automatisme qui permet de géré tout ça.

agencep
Auteur

Bonjour PallMallShow,

exacte et c'est ce que j'ai commenter au moment que tu as poster :D

Tu peux ajouter une colonne 'last_activity' dans ta table.
A chaque fois qu'un utilisateur va effectuer une action, tu met à jour cette date.

Tu peux ensuite faire une tâche cron, qui va parcourir les utilisateurs qui sont 'is_loggued' => true et une 'last_activity' > 1 heure par exemple.

agencep
Auteur

Hello,

au faite il faut trouver une solution qui vérifie que l'utilisateur connecté est bien actif si non il le déconnecte tout seul et autorise le 2ème à se connecter.