Ejemplo n.º 1
0
 /**
  * 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;
 }
Ejemplo n.º 2
0
 /**
  * {@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']);
 }