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 {

        }

3 ответа

Решение

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');
        }
    }   
}

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

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

В пользовательском адаптере AuthenticationAd "установка пользователя в сеансе" или сохранение идентификатора будет выполнено путем возврата \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;

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

Другие вопросы по тегам