[英]How to store session in Redis using Zend 2
我们的应用程序之一有2个服务器实例。 我们使用Redis访问两个服务器的会话。 当我使用电子邮件和密码登录站点时,我又被重定向到登录页面,并且我必须再次输入凭据才能访问模块。 通常,我必须登录两次。
这是登录控制器中的代码,并且两个服务器具有相同的代码:
public function indexAction()
{
$form = new LoginForm();
$form->get('submit')->setValue('Login');
$messages = null;
//considering redis() and server were declared already
$redis = $this->redis();
$server = $this->getServer();
$request = $this->getRequest();
if ($request->isPost()) {
$form->setInputFilter(new LoginFilter($this->getServiceLocator()));
$form->setData($request->getPost());
if ($form->isValid()) {
$data = $form->getData();
$admin = 0;
$user = $this->getEntityManager()->getRepository('\Admin\Entity\User');
$userDetail = $user->getUseCompanyByUsername($data['email']);
if(isset($userDetail) && !empty($userDetail)){
$companyCompanyTypeRepo = $this->getEntityManager()->getRepository('\Admin\Entity\CompanyCompanyType');
$companyCompanyType = $companyCompanyTypeRepo->getCompanyCompanyTypeByCompanyId($userDetail[0]['company_id']);
foreach ($companyCompanyType as $key) {
if(strtolower($key['name'])=='admin'){
$admin=1;
}
}
// begin here
if($admin==1){
$authService = $this->getServiceLocator()->get('Zend\Authentication\AuthenticationService');
$adapter = $authService->getAdapter();
$adapter->setIdentityValue($data['email']);
$adapter->setCredentialValue($data['password']);
$authResult = $authService->authenticate();
if ($authResult->isValid()) {
$identity = $authResult->getIdentity();
$authService->getStorage()->write($identity);
$time = 1209600; // 14 days 1209600/3600 = 336 hours => 336/24 = 14 days
if ($data['rememberme']) {
$sessionManager = new \Zend\Session\SessionManager();
$sessionManager->rememberMe($time);
}
//store user info in session
$this->sessionContainer = new Container('user_info');
$this->sessionContainer->user_info = $userDetail;
if ($redis->hasItem('user_' . $data['email'] .'_' . $server)) {
return $this->redirect()->toRoute('home', array('controller' => 'index', 'action' => 'index'));
} else {
$redis->getOptions()->setTtl(7200);
$redis->setItem('user_' . $data['email'] .'_' . $server, serialize($this->sessionContainer->user_info));
}
}
foreach ($authResult->getMessages() as $message) {
$messages .= "$message\n";
}
}
else
{
$messages="The credential supplied has no access to this portal.";
}
// end here
}else{
$messages="Your authentication credentials are not valid.";
}
}
}
$view = new ViewModel(array(
'error' => 'Your authentication credentials are not valid',
'form' => $form,
'messages' => $messages,
));
return $view;
}
您知道什么地方可能出问题吗? 这对我来说是新的。 非常感谢你的帮助。
因此,基本上,使用Redis进行会话存储根本无法通过这种方式进行...
您遇到的第一个问题是redis不用于存储会话,它用于存储给定时间的用户详细信息的副本:
$redis->getOptions()->setTtl(7200);
$redis->setItem('user_' . $data['email'] .'_' . $server, serialize($this->sessionContainer->user_info));
因此,如果工作正常,则仅意味着您始终被定向在同一服务器上,或者php.ini也配置为在redis或memcached服务器中编写。
对于“每两个登录一次”,如果您遵循代码,则其原因是缓存周围的第一次空间为空,因此进入else(上面的代码),并将详细信息添加到缓存中。 第二次,详细信息被缓存,因此进入if
并被重定向。
您可以看一下此数字海洋教程,以将Redis用于php会话存储 ,并确保您不覆盖Zend Session配置中的这些设置(在配置文件或应用程序中使用的任何Module
类中)。
然后,您将能够删除实际上无法正常工作的缓存,并且绝对不能删除您认为应该的方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.