0

Допустим, что у моей страницы 10 разделов, в 6 из них мне нужно проверить, вошел ли пользователь в систему, а если нет, перенаправляйте его на страницу входа/регистрации ,Аутентификация с доктриной в Zend Framework 2 Хорошая практика

я обнаружил, что повторять этот код в контроллере этих 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(), но в этом случае auth будет запущен для всех моих страниц, и я просто хочу его в некоторых из них.

ответ

4

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

Прочитайте это - Link to DoctrineModule Authentication

После этого вы можете обработать вашу проверку подлинности с помощью ZF2 собственного контроллера и Помощники идентичность. См. Пример в docshere.

0

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

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

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

с этим одним:

$user = $this->identity(); 
0

Я использую этот 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'); 
     } 



    } 

} 
Смежные вопросы