2015-08-11 21 views
5

Desidero disconnettere una sessione utente connessa a un altro browser/ambiente dalla sessione corrente dello stesso utente. Una funzionalità simile a questa - https://www.facebook.com/settings?tab=security&section=sessions&view.Disconnessione remota Yii2 una sessione utente dalla sessione corrente dell'utente

Yii2 è il framework di back-end utilizzato. Utilizzo di redis per la gestione delle sessioni - yii2-redis. Ho anche salvato gli ID di sessione salvati nel database.

Ho seguito questo articolo - http://www.codeinphp.com/general/php-code-snippets/remotely-destroy-different-session-php-forced-user-signout/

ma non ha avuto alcun successo.

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

L'eliminazione della chiave in Redis utilizzando \Yii::$app->session->destroySession($oldSessionId) non è stato chiuso.

Cambiare l'id di sessione su quello precedente e quindi distruggere la sessione non ha funzionato.

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

Se qualcuno ha avuto successo nell'implementazione con successo, si prega di condividere la soluzione. Inoltre, se c'è qualche documentazione in merito a ciò che può aiutare, si prega di fornire.

+0

Grazie a @ Ngô Văn Thao e @Nate per le loro risposte. Questo è l'approccio che ho seguito prendendo gli input dalle loro risposte. Impostare 'enableAutoLogin' su false. Crea una tabella 'session' (user_id, session_id) insieme ad altri attributi relativi al dispositivo, browser. Nel metodo 'afterLogin', aggiungi user_id e session_id alla tabella' session'.Per disconnettere una sessione in remoto, distruggere la sessione usando -Yii :: $ app-> session-> destroySession (sessionId) e modificare il auth_key dell'utente. Nota: questo non ha funzionato per il componente Session predefinito. Funziona bene con 'yii \ redis \ Session' – Gowrav

risposta

3

Il primo, session_start() deve essere chiamata prima session_id() e basta chiamare una sola volta

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

Ma basta rimuovere la sessione, che non è sufficiente se si consente il login automatico dell'utente perché browser login automatico utilizzando i cookie. Per risolvere, è necessario modificare l'utente AuthKey - Yii2 utilizzare AuthKey per convalidare il login automatico dell'utente. Per impostazione predefinita, ogni utente ha un solo AuthKey nella tabella utente in modo tale che quando si modifica il logout utente AuthKey ovunque. Quindi dobbiamo personalizzare. Creare per ogni sessione utente un AuthKey, memorizzato da qualche parte non nella tabella utente. Semplificare: estende yii \ web \ Funzione di override utente afterLogin per creare AuthKey per ogni sessione di accesso. override della funzione validateAuthKey per convalidare il login automatico usa la nostra custom AuthKey. Ora, quando si vuole uccidere qualsiasi sessione utente: kill ID sessione PHP e AuthKey la sessione verrà terminata immediatamente. Ho usato questa soluzione per i miei progetti e funziona perfettamente.

+0

Non funziona per me. Ho autoLogin impostato su true. Uso login username o password basato su https://github.com/yiisoft/yii2-app-basic/blob/master/models/LoginForm.php. La modifica di auth_key aggiorna semplicemente il cookie _identity e non disconnette la sessione. Potete per favore condividere alcuni esempi di codice della vostra implementazione. Inoltre che tipo di accesso utilizzi. – Gowrav

+0

devi uccidere sia la sessione AuthKey che la sessione PHP come hai fatto con la modifica –

+0

o rimuovere 'AuthKey' solo per impedire l'accesso automatico, la sessione php kill terminerà immediatamente la sessione utente. –

1

Sulla base della risposta di Ngo, ho trovato un metodo che funziona bene ed è più semplice da configurare.

1) Aggiungi un campo "last_session_id" alla tabella utente.

2) Aggiungere segue al controller principale:

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) Variazione sito/azione login al seguente:

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, 
     ]); 
    } 
} 
Problemi correlati