2015-05-21 6 views
0

У меня есть следующий код и который работает, но теперь следующий шаг.Zend 2 После авторизации как установить пользователя

Как и где мне нужно установить сеанс, чтобы сценарий «видел», что пользователь уже вошел в систему?

if ($form->isValid()) { 
    $securePass = $this->getUsersTable()->getUserByUsername($this->params()->fromPost('username'));  
    if($securePass){ 
     $bcrypt = new Bcrypt(); 
     if ($bcrypt->verify($this->params()->fromPost('password') , $securePass->password)) { 

      $sm   = $this->getServiceLocator(); 
      $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
      $authAdapter = new AuthAdapter(
        $dbAdapter, 
        'users', 
        'username', 
        'password' 
        ); 
      $authAdapter 
       ->setIdentity($securePass->username) 
       ->setCredential($securePass->password);       

      $result = $authAdapter->authenticate($authAdapter); 
      echo $result->getIdentity() . "\n\n"; 
     } 
     else { 

     } 

ответ

0

LoginController.php

if ($form->isValid()) { 
    $securePass = $this->getUsersTable()->getUserByUsername($this->params()->fromPost('username'));  
    if($securePass){ 
     $bcrypt = new Bcrypt(); 
     if ($bcrypt->verify($this->params()->fromPost('password') , $securePass->password)) { 

      $sm   = $this->getServiceLocator(); 
      $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter'); 
      $authAdapter = new AuthAdapter(
       $dbAdapter, 
       'users', 
       'username', 
       'password' 
      ); 
      $authAdapter->setIdentity($securePass->username) 
      ->setCredential($securePass->password);       
      $result = $authAdapter->authenticate($authAdapter); 

      $sesssionData = $authAdapter->getResultRowObject(); 

      $auth = new AuthenticationService(); 
      $storage = $auth->getStorage(); 
      $storage->write($sesssionData); 

      return $this->redirect()->toRoute('user_list'); 
     } 
    } 
} 



public function onBootstrap(MvcEvent $e) 
{ 

    $eventManager  = $e->getApplication()->getEventManager(); 
    $moduleRouteListener = new ModuleRouteListener(); 
    $moduleRouteListener->attach($eventManager); 
    $app   = $e->getParam('application'); 
    $app->getEventManager()->attach('render', array($this, 'setLayoutTitle')); 
$eventManager->attach(MvcEvent::EVENT_DISPATCH, array($this, 'checkLogin')); 
} 

public function checkLogin(MvcEvent $e) 
{ 
    $iden = new AuthenticationService(); 
    if($iden->getIdentity() === NULL){ 
     $matches = $e->getRouteMatch(); 
     $controller = $matches->getParam('controller'); 
     $getController = explode('\\', $controller); 

     if(isset($getController[2]) && $getController[2] != 'Login'){ 
      $controller = $e->getTarget(); 
      return $controller->plugin('redirect')->toRoute('login'); 
     } 
    } 
} 
1

Способ Zend заключается в использовании компонента аутентификации, который обрабатывает это для вас.

http://framework.zend.com/manual/current/en/modules/zend.authentication.intro.html

Это позволит вам проверить, если пользователь вошел в систему (вы должны установить адаптер аутентификации первый):

use Zend\Authentication\AuthenticationService; 
// TODO set-up authentication adapter 
$auth = new AuthenticationService() 
$identity = $auth->getIdentity(); 

Для доступа к сообщению данных, вы должны также использовать структуру вместо доступа к $ _POST напрямую. В контроллере:

$this->params()->fromPost('username'); 
$this->params()->fromPost('password'); 

Это проведет вас через весь процесс добавления слоя аутентификации в вашем приложении:

https://zf2.readthedocs.org/en/latest/modules/zend.authentication.adapter.dbtable.html

+0

Это показывает, как получить идентичность, но не объясняет, как установить его в первую очередь. – srayner

+0

Я изменил свой скрипт и это работает. Это прекрасно работает, почему так сложно? Теперь я могу проверить, равен ли $ container-> access 1 или 0 – Bas

+1

@Bas. Если вы считаете, что этот ответ сложный, то я сожалею, что zf2 не для вас. Этот ответ показывает, как использовать компонент «Zend \ Authentication» для входа в систему. На вашем пути вся логика домена добавляется в контроллер, что делает контроллер слишком раздутым. Таким образом, это также нарушает структуру MVC! –

1

Используя AuthenticationService предоставленный Zend, настройки пользователя в PHP сессии автоматически позаботится.

Хорошая вещь, чтобы понять механизм аутентификации будет читать, и код вместе с этим введение в подлинности: http://framework.zend.com/manual/current/en/modules/zend.authentication.intro.html#adapters

В пользовательской AuthenticationAdapter «настройки пользователя в сессии», или идентичности настойчивостью бы выполняется путем возврата \ Zend \ Authentication \ Result с результатом аутентификации и идентификатором пользователя в методе authenticate().

$user = $this->userService->findByEmail($this->email); 

if($user !== false) { 
    if($this->encryption->verify($this->password, $user->getPassword()) { 
     return new Result(Result::SUCCESS, $user); 
    } 

    return new Result(Result::FAILURE, null); 
} 

$this->userService being the UserService that leads to the UserMapper 
(more about Services: http://framework.zend.com/manual/current/en/in-depth-guide/services-and-servicemanager.html) 
$user being the User entity with the encrypted password stored 
$this->encryption being your encryption method (Zend\Crypt\Password\Bcrypt for example) 
$this->email being the email/username provided by the form 
$this->password being the password provided by the form 
Result being Zend\Authentication\Result 

Это простой подход. Более детальные типы результатов являются:

/** 
* General Failure 
*/ 
const FAILURE      = 0; 
/** 
* Failure due to identity not being found. 
*/ 
const FAILURE_IDENTITY_NOT_FOUND  = -1; 
/** 
* Failure due to identity being ambiguous. 
*/ 
const FAILURE_IDENTITY_AMBIGUOUS  = -2; 
/** 
* Failure due to invalid credential being supplied. 
*/ 
const FAILURE_CREDENTIAL_INVALID  = -3; 
/** 
* Failure due to uncategorized reasons. 
*/ 
const FAILURE_UNCATEGORIZED   = -4; 
/** 
* Authentication success. 
*/ 
const SUCCESS      = 1; 
Смежные вопросы