zendframework / zend-db

Db component from Zend Framework
BSD 3-Clause "New" or "Revised" License
101 stars 122 forks source link

DbTableAuthAdapter is deprecated how to solve it? #352

Closed zhushaolei closed 5 years ago

zhushaolei commented 5 years ago
public function getServiceConfig()
    {
        return array(
            'abstract_factories' => array(),
            'aliases' => array(),
            'factories' => array(
                // SERVICES
                'AuthService' => function($sm) {
                $dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
                $dbTableAuthAdapter = new DbTableAuthAdapter($dbAdapter, 'user','email','password', 'MD5(?)');

                $authService = new AuthenticationService();
                $authService->setAdapter($dbTableAuthAdapter);
                return $authService;
                },

Provide a narrative description of what you are trying to accomplish. I wish to get a correct solution ( a snippet code) against to DbTableAuthAdapter to fix my login functionality and continue to study and practise on the book" Zend Framework2.0 by example"

zhushaolei commented 5 years ago
<?php
namespace Users\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

use Zend\Authentication\AuthenticationService;
use Zend\Authentication\Adapter\DbTable as DbTableAuthAdapter;

use Users\Form\LoginForm;
use Users\Form\LoginFilter;

use Users\Model\User;
use Users\Model\UserTable;

class LoginController extends AbstractActionController
{
    protected $storage;
    protected $authservice;

    public function getAuthService()
    {
        if (! $this->authservice) {
            $this->authservice = $this->getServiceLocator()->get('AuthService');
        }

        return $this->authservice;
    }

    public function logoutAction()
    {
        $this->getAuthService()->clearIdentity();

        return $this->redirect()->toRoute('users/login');
    }

    public function indexAction()
    {
        $form = $this->getServiceLocator()->get('LoginForm');
        $viewModel  = new ViewModel(array('form' => $form));
        return $viewModel;
    }

    public function processAction()
    {
        if (!$this->request->isPost()) {
            return $this->redirect()->toRoute('users/login');
        }

        $post = $this->request->getPost();

        $form = $this->getServiceLocator()->get('LoginForm');
        $userTable = $this->getServiceLocator()->get('UserTable');

        $form->setData($post);
        if (!$form->isValid()) {
            $model = new ViewModel(array(
                'error' => true,
                'form'  => $form,
            ));
            $model->setTemplate('users/login/index');
            return $model;
        } else {
            //check authentication...
            $this->getAuthService()->getAdapter()
            ->setIdentity($this->request->getPost('email'))
            ->setCredential($this->request->getPost('password'));
            $result = $this->getAuthService()->authenticate();
            if ($result->isValid()) {
                $this->getAuthService()->getStorage()->write($this->request->getPost('email'));
                return $this->redirect()->toRoute('users/login', array(
                    'action' =>  'confirm'
                ));
            } else {
                $model = new ViewModel(array(
                    'error' => true,
                    'form'  => $form,
                ));
                $model->setTemplate('users/login/index');
                return $model;
            }
        }
    }

    public function confirmAction()
    {
        $this->layout('layout/myaccount');
        $user_email = $this->getAuthService()->getStorage()->read();
        $viewModel  = new ViewModel(array(
            'user_email' => $user_email
        ));
        return $viewModel;
    }

}
froschdesign commented 5 years ago

The Zend\Authentication\Adapter\DbTable is not a part of the zend-db component. It belongs to zend-authentication. Please look at the documentation of zend-authentication. There you will find the notification of the deprecation and the also how you can fix the problem: https://docs.zendframework.com/zend-authentication/adapter/dbtable/intro/#zendauthenticationadapterdbtable-class-is-deprecated

For further questions please our forum: https://discourse.zendframework.com