Bonjour,
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
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".
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.
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.
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.