你好,我設法在ZF2中實現了acl和認證,但現在我有兩個主要問題。在他/未登錄後(在引導文件中),我無法重定向用戶,而我的另一個任務是對mysql執行查詢,因爲我必須在登錄後檢查用戶權限。下面的代碼都是Module。 PHP。你可以幫我嗎?到現在我也登錄表單的它工作好(它的工作原理沒有ACL現在)zend框架中的認證+ acl 2
namespace Application;
use Zend\Mvc\ModuleRouteListener;
use Zend\Mvc\MvcEvent;
use Zend\ModuleManager\Feature\AutoloaderProviderInterface;
use Zend\Authentication\Storage;
use Zend\Authentication\AuthenticationService;
use Zend\Authentication\Adapter\DbTable as DbTableAuthAdapter;
class Module
{
protected $loginTable;
public function onBootstrap(MvcEvent $e)
{
$e->getApplication()->getServiceManager()->get('translator');
$eventManager = $e->getApplication()->getEventManager();
$moduleRouteListener = new ModuleRouteListener();
$moduleRouteListener->attach($eventManager);
$this -> initAcl($e);
$e -> getApplication() -> getEventManager() -> attach('route', array($this, 'checkAcl'));
$app = $e->getApplication();
$locator = $app->getServiceManager();
$authAdapter = $locator->get('AuthService');
if($authAdapter->hasIdentity() === true){
//is logged in
}else{
//user is not logged in...redirect to home
}
}
public function getConfig()
{
return include __DIR__ . '/config/module.config.php';
}
public function getAutoloaderConfig()
{
return array(
'Zend\Loader\StandardAutoloader' => array(
'namespaces' => array(
__NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
),
),
);
}
public function getServiceConfig() {
return array(
'factories' => array(
'AuthService' => function($sm) {
$dbAdapter = $sm->get('Zend\Db\Adapter\Adapter');
$dbTableAuthAdapter = new DbTableAuthAdapter($dbAdapter, 'user', 'username', 'password', 'MD5(?)');
$authService = new AuthenticationService();
$authService->setAdapter($dbTableAuthAdapter);
return $authService;
},
),
);
}
public function initAcl(MvcEvent $e) {
$acl = new \Zend\Permissions\Acl\Acl();
$roles = include __DIR__ . '/config/module.acl.roles.php';
$allResources = array();
foreach ($roles as $role => $resources) {
$role = new \Zend\Permissions\Acl\Role\GenericRole($role);
$acl -> addRole($role);
$allResources = array_merge($resources, $allResources);
//adding resources
foreach ($resources as $resource) {
$acl -> addResource(new \Zend\Permissions\Acl\Resource\GenericResource($resource));
}
//adding restrictions
foreach ($allResources as $resource) {
$acl -> allow($role, $resource);
}
}
//testing
//var_dump($acl->isAllowed('admin','home'));
//true
//setting to view
$e -> getViewModel() -> acl = $acl;
}
public function checkAcl(MvcEvent $e) {
$route = $e -> getRouteMatch() -> getMatchedRouteName();
$userRole = 'guest';
if (!$e -> getViewModel() -> acl -> isAllowed($userRole, $route)) {
$response = $e -> getResponse();
//location to page or what ever
$response -> getHeaders() -> addHeaderLine('Location', $e -> getRequest() -> getBaseUrl() . '/404');
$response -> setStatusCode(303);
}
}
}
這只是一個提示,我不知道你是否知道他們,但有兩個偉大的模塊在那裏做這個。他們被稱爲ZfcUser和BjyAuthorize。你可能想看看他們。看到他們如何工作也可以幫助你解決你的問題。 – Sam 2013-03-22 20:08:34
現在我正在努力學習ZF2,我想獨自完成所有工作。我想了解ZF2的工作原理。這是我的主要想法。我想也許有人找到我的差距並幫助我,之後我可以繼續工作。 – 2013-03-22 20:22:55