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§ion=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.