/** * Set an event to use during dispatch * * By default, will re-cast to AdapterChainEvent if another event type is provided. * * @param Event $e * @return self */ public function setEvent(Event $e) { if (!$e instanceof AdapterChainEvent) { $eventParams = $e->getParams(); $e = new AdapterChainEvent(); $e->setParams($eventParams); } $this->event = $e; return $this; }
/** * {@inheritDoc} * * @throws Exception\BadMethodCallException */ public function authenticate(AdapterChainEvent $e) { if ($this->isSatisfied()) { $storage = $this->getStorage()->read(); $e->setIdentity($storage['identity'])->setCode(Result::SUCCESS)->setMessages(['Authentication successful']); return; } $post = $e->getRequest()->getPost(); $identity = $post->get($e->getIdentityKey()); $identityObject = $this->getMapper()->findByIdentity($identity); if (!$identityObject) { $e->setCode(Result::FAILURE_IDENTITY_NOT_FOUND)->setMessages(['A record with the supplied identity could not be found']); $this->setSatisfied(false); return false; } if ($identityObject instanceof PasswordableInterface) { $credential = $post->get($e->getCredentialKey()); $credential = $this->preprocessCredential($credential); $password = $identityObject->getPassword(); if (!$this->getMapper()->getPasswordService()->verify($credential, $password)) { // Password does not match $e->setCode(Result::FAILURE_CREDENTIAL_INVALID)->setMessages(['Supplied credential is invalid']); $this->setSatisfied(false); return false; } // Update user's password hash if the cost parameter has changed $this->updateCredentialHash($identityObject, $credential); } if ($identityObject instanceof StateableInterface) { $allowedStates = $this->options->getAllowedAuthenticationStates(); // Don't allow user to login if state is not in allowed list if ($allowedStates && !in_array($identityObject->getState(), $allowedStates, true)) { $e->setCode(Result::FAILURE_UNCATEGORIZED)->setMessages(['A record with the supplied identity is disabled']); $this->setSatisfied(false); return false; } } if ($identityObject instanceof ExpirableInterface && null !== ($expireAt = $identityObject->getExpireAt()) && $expireAt < new \DateTime('now')) { $e->setCode(Result::FAILURE_UNCATEGORIZED)->setMessages(['Record has expired']); $this->setSatisfied(false); return false; } // Regenerate the id $session = new Container($this->getStorage()->getNameSpace()); $session->getManager()->regenerateId(); // Success! $e->setIdentity($identityObject->getId()); // Remember user if needed if ($post->get('rememberme') && ($ttl = $e->getRememberMeTimeout()) > 0) { $session->getManager()->rememberMe($ttl); } if ($identityObject instanceof LoginTrackableInterface) { $identityObject->setLoginAt(new \DateTime('now')); } $this->getMapper()->update($identityObject)->save(); $this->setSatisfied(true); $storage = $this->getStorage()->read(); $storage['identity'] = $e->getIdentity(); $this->getStorage()->write($storage); $e->setCode(Result::SUCCESS)->setMessages(['Authentication successful']); }