最近,我将 Zend Framework(或 Laminas)的版本从 2.x 升级到 3.x,但在验证用户时遇到了问题。我的代码在 Zend Framework 2 上运行良好,在搜索谷歌并尝试自己解决问题后,我认为我已经缩小了范围,但我只需要一点帮助。
无论如何,这是我的代码
模块.php -
public function getControllerConfig()
{
return [
'factories' => array(
Controller\RegisterController::class => function ($container) {
return new Controller\RegisterController(
$container->get(RegisterModel::class)
);
},
Controller\VerifyController::class => function ($container) {
return new Controller\VerifyController(
$container->get(VerifyModel::class)
);
},
Controller\LoginController::class => function ($container) {
return new Controller\LoginController(
$container->get(LoginModel::class, LoginAuthServiceGateway::class, LoginAuthStorage::class)
);
},
),
];
}
public function getServiceConfig()
{
return [
'factories' =>
LoginAuthServiceGateway::class => function($sm) {
$db_adapter = $sm->get(Adapter::class);
$auth_adapter = new DbTableAuthAdapter($db_adapter, 'users', 'username', 'password');
$auth_service = new AuthenticationService();
$auth_service->setAdapter($auth_adapter);
$auth_service->setStorage($sm->get(LoginAuthStorage::class));
return $auth_service;
},
];
}
我不知道这是否也需要,但这是我的 module.config.php 文件
'controllers' => [
'factories' => [
Controller\LoginController::class => ReflectionBasedAbstractFactory::class,
],
],
当我尝试运行登录代码时,我在控制器文件的第 76 行遇到了关于 Auth 适配器的错误,如下所示
$this->auth_service->getAdapter()
->setIdentity($login->username)
->setCredential($this->model->handleLogin()->verifyCredentials($login)['pass']);
我认为错误是实际服务LoginAuthServiceGateway,但我不完全确定。
哦,如果这也有帮助,这里是异常消息的屏幕截图
任何帮助将不胜感激,如果需要更多信息,我会尽力提供更多
谢谢!
这是我的控制器内部的代码:
use Application\Model\Storage\LoginAuthStorage;
use Laminas\Authentication\AuthenticationService;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\ViewModel;
use Application\Model\LoginModel;
use Application\Form\LoginForm;
use Application\Model\Filters\Login;
class LoginController extends AbstractActionController
{
public $auth_service;
public $storage;
private $model;
public function __construct(LoginModel $model, AuthenticationService $auth_service, LoginAuthStorage $storage)
{
$this->model = $model;
$this->auth_service = $auth_service;
$this->storage = $storage;
}
public function indexAction()
{
if ($this->auth_service->hasIdentity()) {
return $this->redirect()->toRoute('home/user');
}
$form = new LoginForm();
return new ViewModel(array('form' => $form));
}
public function authAction()
{
$form = new LoginForm();
$request = $this->getRequest();
if ($request->isPost()) {
$login = new Login();
$form->setInputFilter($login->getInputFilter());
$form->setData($request->getPost());
if ($form->isValid()) {
$login->exchangeArray($form->getData());
try {
if (!$this->model->handleLogin()->verifyCredentials($login)) {
$this->flashMessenger()->addErrorMessage('Invalid username and/or password');
}
if (!$this->model->handleLogin()->checkSession(array('username' => $login->username))) {
$this->flashMessenger()->addErrorMessage('A session is already active with that username.');
}
} catch (\Exception $e) {
return $this->redirect()->toRoute('home/login', array('action' => 'failure'));
}
// var_dump($this->auth_service);
$this->auth_service->getAdapter()
->setIdentity($login->username)
->setCredential($this->model->handleLogin()->verifyCredentials($login)['pass']);
$result = $this->auth_service->authenticate();
foreach ($result->getMessages() as $message) {
$this->flashMessenger()->addMessage($message);
}
if ($result->isValid()) {
if ($login->remember_me == 1) {
try {
$this->storage->rememberUser(1);
$this->auth_service->getStorage()->write($login->username);
$this->model->handleLogin()->insertSession(array('username' => $login->username,
'password' => $this->model->handleLogin()->verifyCredentials($login)['pass'], 'session_id' => session_id()));
} catch (\Exception $e) {
return $this->redirect()->toRoute('home/login', array('action' => 'failure'));
}
} else if ($login->remember_me == 0) {
try {
$this->storage->rememberUser(0);
$this->auth_service->getStorage()->write($login->username);
$this->model->handleLogin()->insertSession(array('username' => $login->username,
'password' => $this->model->handleLogin()->verifyCredentials($login)['pass'], 'session_id' => session_id()));
} catch (\Exception $e) {
return $this->redirect()->toRoute('home/login', array('action' => 'failure'));
}
}
return $this->redirect()->toRoute('home/user');
} else {
foreach ($result->getMessages() as $message) {
$this->flashMessenger()->addErrorMessage($message);
}
return $this->redirect()->toRoute('home/login', array('action' => 'failure'));
}
} else {
$this->flashMessenger()->addErrorMessage("Invalid form submitted, most likely due to invalid credentials or empty values.");
return $this->redirect()->toRoute('home/login', array('action' => 'failure'));
}
}
}
public function failureAction()
{
$this->layout('layout/failure');
}
}