Php Zend Framework 2良好实践中的条令认证

Php Zend Framework 2良好实践中的条令认证,php,authentication,model-view-controller,doctrine-orm,zend-framework2,Php,Authentication,Model View Controller,Doctrine Orm,Zend Framework2,假设我的页面有10个部分,在其中的6个部分中,我必须检查用户是否已登录,如果未登录,则将其重定向到“登录/注册”页面 我发现自己在这6页的控制器中重复了这段代码: 需要sauthaction()的公共函数操作 { $sl=$this->getServiceLocator(); $authService=$sl->get('doctrine.authenticationservice.orm_default'); $user=$authService->getStorage()->read();/

假设我的页面有10个部分,在其中的6个部分中,我必须检查用户是否已登录,如果未登录,则将其重定向到“登录/注册”页面

我发现自己在这6页的控制器中重复了这段代码:

需要sauthaction()的公共函数操作
{
$sl=$this->getServiceLocator();
$authService=$sl->get('doctrine.authenticationservice.orm_default');
$user=$authService->getStorage()->read();//用户是否已登录?
如果($user){//auth成功
//-------------/*此特定控制器的代码位于此处*/--------
返回新的ViewModel(数组(
“用户”=>$user,
“somethingelse”=>somethingelse美元
));
}否则{//auth被拒绝
返回$this->redirect()->toRoute(用户,数组('action'=>login');
} 
}
我试图将其封装到一个名为
islogged
(这是一个模型,不是一个控制器)的服务中,但我无法使其工作,因为我无法找到从模型内部重定向到控制器的方法,我只知道如何通过另一个控制器重定向到控制器

因此,在我的
usermanager.php
中,我有一个这样的函数:

public函数被记录()
{
$sl=$this->getServiceLocator();
$authService=$sl->get('doctrine.authenticationservice.orm_default');
$user=$authService->getStorage()->read();//用户是否已登录?
如果($user){//auth成功
返回$user;
}否则{
/*
重定向到登录屏幕,不知道如何操作,
此代码在此处不起作用:
返回$this->redirect()->toRoute(NULL,数组(
“控制器”=>“用户”,
'操作'=>'登录'
));
*/
}
}
所以我的想法是,在我的控制器中,我只需要写:

$user=islogged();
我提到的所有代码重复都不再需要了

我试着用usermanager.php
isloged
函数做的是一个好的实践吗? 如果这是一个好的实践,我应该如何从模型内部重定向到控制器

如果这不是一个好的实践,那么哪种方法可以避免控制器中的所有代码重复


我知道我可以将身份验证步骤放入
onboostrap()
中,但在这种情况下,我的所有页面都会触发身份验证,我只想在其中一些中使用它。

我建议您使用回购协议的
文档
文件夹中描述的官方
DoctrineModule身份验证实施条令身份验证

请阅读以下内容-


然后,您可以通过zf2自己的控制器处理身份验证检查,并查看帮助程序标识。参见
文档中的示例

我建议您使用回购协议的
文档
文件夹中描述的官方
文档模块认证
实施条令认证

请阅读以下内容-


然后,您可以通过zf2自己的控制器处理身份验证检查,并查看帮助程序标识。参见
文档中的示例

我唯一要做的就是替换这两行:

$authService=$this->getServiceLocator()
->get('doctrine.authenticationservice.orm_default');
$user=$authService->getStorage()->read()//用户是否已登录?
关于这一点:

$user=$this->identity();

我唯一要做的就是替换这两行:

$authService=$this->getServiceLocator()
->get('doctrine.authenticationservice.orm_default');
$user=$authService->getStorage()->read()//用户是否已登录?
关于这一点:

$user=$this->identity();

我在我的应用程序上使用此ACL模块:

然后,我的客户概览控制器看起来是这样的:

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



    }

} 

我在我的应用程序上使用此ACL模块:

然后,我的客户概览控制器看起来是这样的:

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



    }

}