Аутентификация с помощью Doctrine в Zend Framework 2. Хорошие практики

Допустим, на моей странице 10 разделов, в 6 из которых я должен проверить, вошел ли пользователь в систему, и если нет, перенаправить его на страницу «Войти / Зарегистрироваться».

Я обнаружил, что повторяю этот код в контроллере этих 6 страниц:

public function actionthatneedsauthAction()
{
$sl = $this->getServiceLocator();
$authService = $sl->get('doctrine.authenticationservice.orm_default');
$user = $authService->getStorage()->read();  //is the user logged in?

if ($user) {  //auth successful

//-------------/*CODE FOR THIS SPECIFIC CONTROLLER GOES HERE*/--------

return new ViewModel(array(
'user' => $user,
'somethingelse' => $somethingelse
));

} else { //auth denied
return $this->redirect()->toRoute(user, array('action' => 'login'));
}
}

Я пытался заключить это в службу под названием islogged (это модель, а не контроллер), но я не мог заставить его работать, потому что я не мог найти способ перенаправить на контроллер изнутри модели, я только знаю, как перенаправить на контроллер через другой контроллер.

Так по моему usermanager.php У меня была такая функция:

public function islogged()
{
$sl = $this->getServiceLocator();
$authService = $sl->get('doctrine.authenticationservice.orm_default');

$user = $authService->getStorage()->read();  //is the user logged in?

if ($user) {  //auth successful
return $user;
} else {
/*
redirect to the login screen, dont know how to do it,
this code doesnt work here:

return $this->redirect()->toRoute(NULL, array(
'controller' => 'user',
'action' => 'login'
));
*/
}
}

поэтому идея заключалась в том, что в моих контроллерах мне нужно было только написать:

$user = islogged();

и все повторение кода, которое я упомянул, больше не понадобится.

Это хорошая практика, что я пытался сделать с usermanager.php islogged функционировать?
Если это хорошая практика, как я должен перенаправить на контроллер из модели?

Если это не очень хорошая практика, какой способ избежать повторения кода в моих контроллерах?

Я знаю, что могу поставить шаг аутентификации в onboostrap() но в этом случае аутентификация будет срабатывать для всех моих страниц, и я просто хочу, чтобы в некоторых из них.

0

Решение

Я бы посоветовал вам внедрить аутентификацию Doctrine с официальным DoctrineModule Authentication описано в docs папка репо.

Прочитай это — Ссылка на DoctrineModule Authentication

Затем вы можете обработать проверку подлинности через собственный контроллер zf2 и просмотреть помощники идентичность. Смотрите пример в docs Вот.

4

Другие решения

Я использую этот модуль ACL в своих приложениях: https://github.com/ZF-Commons/zfc-rbac

Мой контроллер обзора клиента выглядит так:

<?php
namespace RoleBasedCustomer\Controller;

use RoleBasedUser\Service\AuthenticationService;
use RoleBasedUser\Service\UserService;
use RoleBasedUser\Controller\AbstractMultiModelController;

class OverviewController extends AbstractMultiModelController
{

public function __construct(
AuthenticationService   $authService,
UserService             $userService
) {
$this->authService       = $authService;
$this->userService       = $userService;
}

public function indexAction()
{

if ( ! $this->authService->hasIdentity() ) {
return $this->redirect()->toRoute('customer/login');
}}

}
0

Единственное, что мне нужно было сделать, это заменить эти две строки:

$authService = $this->getServiceLocator()
->get('doctrine.authenticationservice.orm_default');

$user = $authService->getStorage()->read();  //is the user logged in?

с этим:

$user = $this->identity();
0
По вопросам рекламы [email protected]