我们的一个应用程序有2个服务器实例。我们使用Redis访问两台服务器的会话。 当我使用电子邮件和密码登录网站时,我被重定向到登录页面,我不得不再次输入凭据,以便我可以访问模块。一般来说,我必须登录两次。
这是Login Controller中的代码,两个服务器都具有相同的代码:
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;
}
你知道可能出现什么问题吗?这对我来说是新的。 非常感谢你的帮助。
答案 0 :(得分:1)
所以基本上,使用Redis进行会话存储根本不会以这种方式工作......
您遇到的第一个问题是redis不用于存储会话,它用于存储给定时间内用户详细信息的副本:
$redis->getOptions()->setTtl(7200);
$redis->setItem('user_' . $data['email'] .'_' . $server, serialize($this->sessionContainer->user_info));
因此,如果它有效,它只表示您总是被定向在同一台服务器上,或者您的php.ini也被配置为在redis或memcached服务器中写入。
对于"每两次登录一次",如果你遵循你的代码,它来自于第一次围绕缓存是空的,因此进入else(上面的代码),并添加缓存的详细信息。第二次,细节被缓存,因此进入if
并重定向。
您可以查看这个数字海洋教程use redis for php sessions storage,并确保不要在Zend会话配置中覆盖这些设置(在配置文件或您使用的任何Module
类中应用
然后,您将能够删除实际上无法正常工作的缓存,并且绝对不是您认为的那样。