start sesiones sesion pasar paginas navegador manejo entre ejemplo destruir cerrar php session redis yii2 logout

sesiones - session start php login



Yii2 cierre de sesión remoto una sesión de usuario de la sesión actual del usuario (2)

Quería cerrar la sesión de una sesión de usuario registrada en un navegador / entorno diferente de la sesión actual del mismo usuario. Una función similar a esto - https://www.facebook.com/settings?tab=security&section=sessions&view .

Yii2 es el marco de backend utilizado. Uso de redis para la gestión de sesiones - yii2-redis . También guardo los ID de sesión guardados en la base de datos.

Seguí este artículo - http://www.codeinphp.com/general/php-code-snippets/remotely-destroy-different-session-php-forced-user-signout/

Pero no tuvo ningún éxito.

session_id($old_session_id); session_start(); // This line throws error. session_destroy();

Al eliminar la clave en redis usando /Yii::$app->session->destroySession($oldSessionId) no se /Yii::$app->session->destroySession($oldSessionId) sesión.

Cambiar el ID de sesión al anterior y luego destruir la sesión tampoco funcionó.

$currentSessionId = /Yii::$app->session->getId(); /Yii::$app->session->setId($oldSessionId); /Yii::$app->getSession()->destroy(); /Yii::$app->session->setId($currentSessionId);

Si alguien tuvo éxito al implementar esto con éxito, comparta su solución. También si hay alguna documentación con respecto a esto que pueda ayudar, por favor proporcione.


En base a la respuesta de Ngo, descubrí un método que funciona bien y es más fácil de configurar.

1) Agregue un campo "last_session_id" a su tabla de usuario.

2) Agregue siguiente a su controlador principal:

public function afterAction($action, $result) { $result = parent::afterAction($action, $result); if(Yii::$app->user->id) { //update the user table with last_session_id $user = User::find()->where([''id'' => Yii::$app->user->id])->one(); $user->last_session_id = Yii::$app->session->id; $user->save(false); } return $result; }

3) Cambiar la acción de sitio / inicio de sesión a lo siguiente:

public function actionLogin() { if (!/Yii::$app->user->isGuest) { return $this->goHome(); } $model = new LoginForm(); if ($model->load(Yii::$app->request->post()) && $model->login()) { //delete previous session ID and change auth key Yii::$app->session->destroySession(Yii::$app->user->identity->last_session_id); $u = /common/models/User::find()->where([''id'' => Yii::$app->user->id])->one(); $u->auth_key = Yii::$app->security->generateRandomString(); $u->save(false); return $this->goBack(); } else { return $this->render(''/site/login'', [ ''model'' => $model, ]); } }


La primera, session_start() debe ser session_id() antes de session_id() y solo debe llamar una vez

if (session_status() == PHP_SESSION_NONE) { session_start(); } session_id($old_session_id); session_destroy();

Pero solo elimine la sesión, eso no es suficiente si permite el inicio de sesión automático del usuario porque el navegador iniciará sesión automáticamente mediante el uso de cookies. Para resolverlo, debe cambiar el AuthKey usuario: Yii2 use AuthKey para validar el inicio de sesión automático del usuario. De forma predeterminada, cada usuario tiene solo una AuthKey en la tabla de usuario para que cuando usted cambie el usuario de AuthKey cierre sesión en cualquier lugar. Entonces tenemos que personalizar Cree para cada sesión de usuario una AuthKey , almacenada en algún lugar que no esté en la tabla de usuario. Hágalo fácil: amplía yii / web / User class override afterLogin function para crear AuthKey para cada sesión de inicio de sesión. anula la función validateAuthKey para validar el inicio de sesión automático utilizando nuestra AuthKey personalizada. Ahora, cuando quiera matar cualquier sesión de usuario: AuthKey identificación de sesión de PHP y AuthKey la sesión se cerrará de inmediato. He estado usando esta solución para mis proyectos y funciona bien.