Php Zend Framework 2良好实践中的条令认证
假设我的页面有10个部分,在其中的6个部分中,我必须检查用户是否已登录,如果未登录,则将其重定向到“登录/注册”页面 我发现自己在这6页的控制器中重复了这段代码: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();/
需要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.phpisloged
函数做的是一个好的实践吗?
如果这是一个好的实践,我应该如何从模型内部重定向到控制器
如果这不是一个好的实践,那么哪种方法可以避免控制器中的所有代码重复
我知道我可以将身份验证步骤放入
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');
}
}
}