女士们,先生们,
我正在努力开发基于Zend Framework的新Web应用程序。 几乎整个Web应用程序都将通过登录(用户名和密码)进行保护。
我的想法是检查访问者是否可以进行身份验证,如果没有检查用户是否正在请求登录路由。如果他没有尝试登录,他将被重定向到登录页面。
<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
/**
* Bootstrap::_initRouterRewrites()
*
* @return void
*/
protected function _initRouterRewrites()
{
$frontController = Zend_Controller_Front::getInstance();
$this->router = $frontController->getRouter();
$this->router->addRoute(
'default',
new Zend_Controller_Router_Route('/',
array('controller' => 'index',
'action' => 'index'))
)
->addRoute(
'login',
new Zend_Controller_Router_Route('/inloggen.html',
array('controller' => 'auth',
'action' => 'login'))
);
}
/**
* Bootstrap::_initZendSession()
*
* @return void
*/
protected function _initZendSession()
{
// Ensure that both the session and the db resources are bootstrapped
$this->bootstrap(array('db', 'session'));
// Actually start the session
Zend_Session::start();
}
/**
* Bootstrap::_initAuthentication()
*
* @return void
*/
protected function _initAuthentication()
{
// Instantiate auth object
$auth = Zend_Auth::getInstance();
// Check if visitor has an identity
if (!$auth->hasIdentity())
{
}
}
}
当我在_initAuthentication方法中使用方法$ this-&gt; router-&gt; getCurrrentRoute()时,我收到以下错误:“当前路线未定义”。
如何检查当前路线是否登录?
提前致谢!
答案 0 :(得分:4)
在引导路由时,路由已经运行。您需要的是FrontController Plugin,它在适当的位置挂钩请求生命周期。在你的情况下,在路由确定了发送请求的位置后,可能会在routeShutdown
期间。
来自http://devzone.zend.com/1692/zend-framework-mvc-request-lifecycle/:
答案 1 :(得分:0)
在bootstrap.php中使用这样的插件:
protected function _initPlugins() {
$front = Zend_Controller_Front::getInstance();
$front->registerPlugin(new Plugin_Checkaccess());
}
并在plugins / Checkaccess.php中 `
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
$request = $this->getRequest();
$controllerName = strtolower($request->getControllerName());
$actionName = strtolower($request->getActionName());
if ('user' == $controllerName)
{
$session = new Zend_Session_Namespace('USER');
$notLogged = array('login','register');
if(!in_array($actionName, $notLogged) && !$session->user){
$request->setControllerName("index");
$request->setActionName("index");
$this->_response->setRedirect('/');
//$this->_response->setRedirect('/?redirectTo='.$this->_request->getRequestUri());
}elseif(in_array($actionName, $notLogged) && $session->user){
$request->setControllerName("user");
$request->setActionName("index");
$this->_response->setRedirect('/home');
}
return;
}
} }`