2015-08-11 3 views
5

Я хотел выйти из сеанса пользователя, зарегистрированного в другом браузере/среде, из текущего сеанса того же пользователя. Схожая функция - https://www.facebook.com/settings?tab=security&section=sessions&view.Yii2 удаленный выход из сеанса пользователя с текущего сеанса пользователя

Yii2 - используемый бэкэнд-каркас. Использование redis для управления сессиями - yii2-redis. Я также сохраняю идентификаторы сеанса, сохраненные в базе данных.

Я последовал за эту статью - http://www.codeinphp.com/general/php-code-snippets/remotely-destroy-different-session-php-forced-user-signout/

Но не имел никакого успеха.

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

Удаление ключа в Redis с помощью \Yii::$app->session->destroySession($oldSessionId) не выход из системы.

Изменение идентификатора сеанса до старого, а затем уничтожение сеанса также не сработало.

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

Если кто-то успел успешно реализовать это решение, поделитесь своим решением. Также, если есть какая-либо документация, которая может помочь, пожалуйста, предоставьте.

+0

Благодаря @ Нго VAN Тхао и @Nate для своих ответов. Это тот подход, который я последовал за вводом их ответов. Установите 'enableAutoLogin' значение false. Создайте таблицу 'session' (user_id, session_id) вместе с другими атрибутами, связанными с устройством, браузером. В методе 'afterLogin' добавьте user_id и session_id в таблицу' session'.Чтобы удаленно выйти из сеанса, уничтожьте сеанс с помощью -Yii :: $ app-> session-> destroySession (sessionId) и измените auth_key пользователя. Примечание. Это не работает для компонента Session по умолчанию. Прекрасно работает с 'yii \ redis \ Session' – Gowrav

ответ

3

Первое, session_start() необходимо позвонить перед тем session_id() и просто вызвать только один раз

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

Но просто удалить сеанс, этого не достаточно, если вы позволите пользователя автоматического логина, потому что браузер будет автоматический вход с использованием куки. Чтобы решить, вы должны изменить пользователя AuthKey - Yii2 использовать AuthKey, чтобы подтвердить авторизацию пользователя. По умолчанию каждый пользователь имеет только одну таблицу AuthKey в таблице пользователя, чтобы при изменении входа пользователя AuthKey в любом месте. Поэтому мы должны настраиваться. Создайте для каждого сеанса пользователя AuthKey, который хранится где-то не в пользовательской таблице. Сделать это легко: расширяет yii \ web \ Пользовательский класс переопределяет функцию afterLogin для создания AuthKey для каждого сеанса входа. override validateAuthKey функция для проверки автозагрузки использовать наш пользовательский номер AuthKey. Теперь, когда вы хотите убить любой пользовательский сеанс: убить идентификатор сеанса PHP и AuthKey, этот сеанс будет немедленно удален. Я использую это решение для своих проектов, и он отлично работает.

+0

Не работает для меня. У меня autoLogin установлен в true. Я использую имя пользователя + пароль на основе имени, аналогичное https://github.com/yiisoft/yii2-app-basic/blob/master/models/LoginForm.php. Изменение auth_key только обновляет файл cookie _identity и не выходит из сеанса. Можете ли вы поделиться некоторым примером кода вашей реализации. Также, какой тип входа вы используете. – Gowrav

+0

вы должны убить как AuthKey, так и PHP-сеанс так же, как и вы сделали –

+0

изменить или удалить 'AuthKey', чтобы предотвратить автоматический вход в систему, убить php-сессию сразу же отключит пользовательский сеанс. –

1

Основываясь на ответе Нго, я выяснил метод, который хорошо работает и его легче настроить.

1) Добавьте поле "last_session_id" в таблицу пользователя.

2) Добавить следующее к главному контроллеру:

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) Изменение сайта/действие входа к следующему:

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, 
     ]); 
    } 
} 
Смежные вопросы