Событие/Наблюдатель После смены пароля Автоматически выходит из системы
Я ищу способ подключиться к событию, когда клиенты меняют свои пароли. Поэтому, если кто-то изменит пароль в интерфейсе клиента, я бы хотел автоматически выйти из системы, когда пользователь изменит пароль на странице учетной записи. пожалуйста, помогите автоматически выйти из системы после смены пароля.
3 answers
Подключитесь к событию controller_action_postdispatch_customer_account_resetpasswordpost
и в наблюдателе вы можете написать следующий код для программного выхода из системы:
Mage::getSingleton('customer/session')->logout();
РЕДАКТИРОВАТЬ
Вам необходимо создать новый модуль.
Давайте назовем это Company_Module
.app/etc/modules/Company_Module.xml
- файл декларации
<?xml version="1.0"?>
<config>
<modules>
<Company_Module>
<codePool>local</codePool>
<active>true</active>
</Company_Module>
</modules>
</config>
app/code/local/Company/Module/etc/config.xml
- файл конфигурации
<?xml version="1.0"?>
<config>
<modules>
<Company_Module>
<version>0.0.1</version>
</Company_Module>
</modules>
<global>
<models>
<company_module>
<class>Company_Module_Model</class>
</company_module>
</models>
</global>
<frontend>
<events>
<controller_action_postdispatch_customer_account_resetpasswordpost><!-- observe the event -->
<observers>
<company_module>
<class>company_module/observer</class>
<method>logout</method>
</company_module>
</observers>
</controller_action_postdispatch_customer_account_resetpasswordpost>
</events>
</frontend>
</config>
app/code/local/Company/Module/Model/Observer.php
- класс наблюдения
<?php
class Company_Module_Model_Observer {
public function logout($observer) {
if (version_compare(Mage::getVersion(), '1.7', '<')) {
$session = Mage::getSingleton('customer/session');
if ($session->isLoggedIn()) {
Mage::getSingleton('customer/session')->logout();
}
}
}
}
Очистите кэш, когда закончите.
В Magento по умолчанию эта функция уже существует. Вы можете увидеть это в этом в методе Mage_Customer_AccountController::resetPasswordPostAction()
на app/code/core/Mage/Customer/controllers/AccountController.php
.
public function resetPasswordPostAction()
{
.....
try {
// Empty current reset password token i.e. invalidate it
$customer->setRpToken(null);
$customer->setRpTokenCreatedAt(null);
$customer->cleanPasswordsValidationData();
$customer->save();
$this->_getSession()->unsetData(self::TOKEN_SESSION_NAME);
$this->_getSession()->unsetData(self::CUSTOMER_ID_SESSION_NAME);
$this->_getSession()->addSuccess($this->_getHelper('customer')->__('Your password has been updated.'));
$this->_redirect('*/*/login');
} catch (Exception $exception) {
$this->_getSession()->addException($exception, $this->__('Cannot save a new password.'));
$this->_redirect('*/*/changeforgotten');
return;
}
}
Как вы можете видеть, если все работает хорошо, то Magento сначала сохранит новый пароль. Затем он отключит текущую сессию клиента, после чего клиент будет перенаправлен на страницу входа в систему.
Итак, в вашем случае клиент не вышел из системы, значит, в этом методе контроллера была произведена некоторая настройка/перезапись. Вам нужно выяснить это и применить то же самое, что и Magento делает это здесь, в этом настраиваемом разделе.
Ответ Манашви это тоже хорошо, и вы можете использовать его без двойных мыслей. Но, на мой взгляд, лучшее решение - это применить следующие изменения к настраиваемому разделу
//invalidate session
$this->_getSession()->unsetData(self::TOKEN_SESSION_NAME);
$this->_getSession()->unsetData(self::CUSTOMER_ID_SESSION_NAME);
$this->_getSession()->addSuccess($this->_getHelper('customer')->__('Your password has been updated.'));
//redirecting to login page
$this->_redirect('*/*/login');
Я думаю, вам нужно проверить ниже событие
customer_save_after
В описанном выше случае вы можете проверить смену пароля и выйти из системы для этого конкретного клиента,
При смене пароля это событие также вызывается, чтобы вы могли попробовать с этим событием
Надеюсь, это поможет вам.