Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

visitante_php

[Resolvido] zend + autenticacao

Recommended Posts

Matias, acho que tem um erro, não sei se foi no momento de digitar aqui no fórum, mas, em protected $_notLoggedRoute, você definiu o module como index, quando o correto seria default.

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu fiz isto

 

public function preDispatch( Zend_Controller_Request_Abstract $request )
{

   	Zend_Debug::dump( $request -> getModuleName(), 'Módulo' );
   	Zend_Debug::dump( $request -> getControllerName(), 'Controller' );
   	Zend_Debug::dump( $request -> getActionName(), 'Action' );


   	if ( $request -> getModuleName() != 'index' )
	{
       	$controller = "";
       	$action = "";
       	$module = "";
      	/* if ( ! $this -> _auth -> hasIdentity() )
       	{
           	$controller = $this -> _notLoggedRoute [ 'controller' ];
           	$action = $this -> _notLoggedRoute [ 'action' ];
           	$module = $this -> _notLoggedRoute [ 'module' ];
       	}
       	else*/ if ( ! $this -> _isAuthorized( $request -> getControllerName(), $request -> getActionName() ) )
       	{
           	$controller = $this -> _forbiddenRoute [ 'controller' ];
           	$action = $this -> _forbiddenRoute [ 'action' ];
           	$module = $this -> _forbiddenRoute [ 'module' ];
       	}
       	else
       	{
           	$controller = $request -> getControllerName();
           	$action = $request -> getActionName();
           	$module = $request -> getModuleName();
       	}
       	$request -> setControllerName( $controller );
       	$request -> setActionName( $action );
       	$request -> setModuleName( $module );
   	}

 

comentei o prmeiro if, e foi pra pagina de erro...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Matias, acho que tem um erro, não sei se foi no momento de digitar aqui no fórum, mas, em protected $_notLoggedRoute, você definiu o module como index, quando o correto seria default.

Nem fui eu que digitei. Só copiei o que já existia.

 

Igor, você não fez o que eu falei. Seria trocar:

 

if ( $request -> getModuleName() != 'index' )

 

Por

if ( $request -> getModuleName() != 'default' )

 

Além disto, modifique o que o JCMais comentou também. Pode remover este comentário, porque ele só vai ser usado cada o módulo não seja o default (que é o do site).

 

Se ele não bloquear as páginas do módulo "blog" e do módulo "admin" o problema está em outro lugar.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

esta assim agora o plugin, e continua permitindo todas as paginas...

 

<?php

class Aplicacao_Plugin_Auth extends Zend_Controller_Plugin_Abstract
{

/**
	* @var Zend_Auth
	*/
protected $_auth = null;
/**
	* @var Zend_Acl
	*/
protected $_acl = null;
/**
	* @var array
	*/
protected $_notLoggedRoute = array(
   	'controller' => 'Index',
   	'action' => 'index',
   	'module' => 'default'
);
/**
	* @var array
	*/
protected $_forbiddenRoute = array(
   	'controller' => 'error',
   	'action' => 'forbidden',
   	'module' => 'admin'
);


public function __construct()
{
   	$this -> _auth = Zend_Auth::getInstance();
   	$this -> _acl = Zend_Registry::get( 'acl' );
}

public function preDispatch( Zend_Controller_Request_Abstract $request )
{

   	Zend_Debug::dump( $request -> getModuleName(), 'Módulo' );
   	Zend_Debug::dump( $request -> getControllerName(), 'Controller' );
   	Zend_Debug::dump( $request -> getActionName(), 'Action' );


   	if ( $request -> getModuleName() != 'default' )
   	{
       	$controller = "";
       	$action = "";
       	$module = "";
       	if ( ! $this -> _auth -> hasIdentity() )
       	{
           	$controller = $this -> _notLoggedRoute [ 'controller' ];
           	$action = $this -> _notLoggedRoute [ 'action' ];
           	$module = $this -> _notLoggedRoute [ 'module' ];
       	}
       	else if ( ! $this -> _isAuthorized( $request -> getControllerName(), $request -> getActionName() ) )
       	{
           	$controller = $this -> _forbiddenRoute [ 'controller' ];
           	$action = $this -> _forbiddenRoute [ 'action' ];
           	$module = $this -> _forbiddenRoute [ 'module' ];
       	}
       	else
       	{
           	$controller = $request -> getControllerName();
           	$action = $request -> getActionName();
           	$module = $request -> getModuleName();
       	}
       	$request -> setControllerName( $controller );
       	$request -> setActionName( $action );
       	$request -> setModuleName( $module );
   	}
}

protected function _isAuthorized( $controller, $action )
{
   	$this -> _acl = Zend_Registry::get( 'acl' );
   	$user = $this -> _auth -> getIdentity();
   	if ( ! $this -> _acl -> has( $controller ) || ! $this -> _acl -> isAllowed( $user, $controller, $action ) )
       	return false;
   	return true;
}

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema está aqui:

 

} else if (! $this->_isAuthorized ( $request->getControllerName (), $request->getActionName () )) {

 

Ele está testando o controller independente do módulo. Então, um controller index no módulo admin ou no módulo blog vai permitir, porque ele está usando no neste formato, ignorando o módulo.

 

Você vai ter permissões diferentes dentro do módulo admin ou quem pode acessar pode fazer tudo? A mesma pergunta para o blog.

 

Com isto posso sugerir uma mudança no plugin para funcionar.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites
Você vai ter permissões diferentes dentro do módulo admin ou quem pode acessar pode fazer tudo? A mesma pergunta para o blog.

 

a segunda opcao, vou ter permissoes diferentes dentro dos modulos admin e blog...

 

uma coisa que percebi, eh que at mesmo o controller auth q faz o login esta so redirecionando para o index...eh como se fosse sempre redirecionado para a index,...eu coloquei um nome diferente em cada phtml, e vi q ele esta sempre sendo redirecionado para o controller index, e nao para o modulo index...

Compartilhar este post


Link para o post
Compartilhar em outros sites

agora o plugin esta assim, porem quando acesso o endereço raiz ele vai para o conroler e nao par aoo modulo default(index), uando eu tento acessar o modulo index, admin, e blog, ele bloqueia...

 


<?php

class Aplicacao_Plugin_Auth extends Zend_Controller_Plugin_Abstract
{

/**
	* @var Zend_Auth
	*/
protected $_auth = null;
/**
	* @var Zend_Acl
	*/
protected $_acl = null;
/**
	* @var array
	*/
protected $_notLoggedRoute = array(
   	'controller' => 'Index',
   	'action' => 'index',
   	'module' => 'default'
);
/**
	* @var array
	*/
protected $_forbiddenRoute = array(
   	'controller' => 'auth',
   	'action' => 'login',
   	'module' => 'admin'
);


public function __construct()
{
   	$this -> _auth = Zend_Auth::getInstance();
   	$this -> _acl = Zend_Registry::get( 'acl' );
}

public function preDispatch( Zend_Controller_Request_Abstract $request )
{

   	Zend_Debug::dump( $request -> getModuleName(), 'Módulo' );
   	Zend_Debug::dump( $request -> getControllerName(), 'Controller' );
   	Zend_Debug::dump( $request -> getActionName(), 'Action' );


   	if ( $request -> getModuleName() != 'default' )
   	{
       	$controller = "";
       	$action = "";
       	$module = "";
       	/*if ( ! $this -> _auth -> hasIdentity() )
       	{
           	$controller = $this -> _notLoggedRoute [ 'controller' ];
           	$action = $this -> _notLoggedRoute [ 'action' ];
           	$module = $this -> _notLoggedRoute [ 'module' ];
       	}
       	else */if ( ! $this -> _isAuthorized( $request -> getControllerName(), $request -> getActionName() ) )
       	{
           	$controller = $this -> _forbiddenRoute [ 'controller' ];
           	$action = $this -> _forbiddenRoute [ 'action' ];
           	$module = $this -> _forbiddenRoute [ 'module' ];
       	}
       	else
       	{
           	$controller = $request -> getControllerName();
           	$action = $request -> getActionName();
           	$module = $request -> getModuleName();
       	}
       	$request -> setControllerName( $controller );
       	$request -> setActionName( $action );
       	$request -> setModuleName( $module );
   	}
}

protected function _isAuthorized( $controller, $action )
{
   	$this -> _acl = Zend_Registry::get( 'acl' );
   	$user = $this -> _auth -> getIdentity();
   	if ( ! $this -> _acl -> has( $controller ) || ! $this -> _acl -> isAllowed( $user, $controller, $action ) )
       	return false;
   	return true;
}

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, não entendi muito bem o que você disse, mas vamos lá.

e nao par aoo modulo default(index),

 

O nome do seu módulo principal é index ou default? Por que da forma que você está dizendo está estranho, você quer dizer que tentou acessar a página correspondente à:

module->default - controller->index - action->index

 

Correto?

 

Pois pela imagem que você passou:

 

zendacls.png

 

 

Na realidade você tem 4 modules:

O default (que é a pasta da aplicação em si), o index, o admin e o blog.

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu achei q todos od modulos ficassem dentro da pasta modules, e la dentro criei o modulo index q seria o default....entao ao q parece agora esta certo, porem com uma excessao: o usuario escritor nao esta tendo acesso bloqueado para o modulo admin, e deveria ter...

 

haveria a possibilidade de me pasar algo que seja simples, mas de multinivel? por favor...

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu consegui fazer funcionar com controlers e com modulos, porem ainda ha o problema de permissao, pois os niveis de escritor e admin do tutorial, acessam ambas as paginas: blog e admin..... :( :no:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pois é... isto acontece porque a permissão só leva em consideração controller/action.

 

Para não ter que mudar muito a sua estrutura, o que eu sugiro é que você modifique os recursos, deixando modulo-controler. No plugin você faz a verificação no isAllowed usando também o modulo-controller.

 

Captou a ideia? Achei meio porco, mas...

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

deu certo nao, fiz assim

(este eh o plugin do sistema modular - com modulos)

<?php

class Aplicacao_Plugin_Auth extends Zend_Controller_Plugin_Abstract
{

/**
	* @var Zend_Auth
	*/
protected $_auth = null;
/**
	* @var Zend_Acl
	*/
protected $_acl = null;
/**
	* @var array
	*/
protected $_notLoggedRoute = array(
   	'controller' => 'Index',
   	'action' => 'index',
   	'module' => 'default'
);
/**
	* @var array
	*/
protected $_forbiddenRoute = array(
   	'controller' => 'auth',
   	'action' => 'login',
   	'module' => 'admin'
);


public function __construct()
{
   	$this -> _auth = Zend_Auth::getInstance();
   	$this -> _acl = Zend_Registry::get( 'acl' );
}

public function preDispatch( Zend_Controller_Request_Abstract $request )
{

 	/*  Zend_Debug::dump( $request -> getModuleName(), 'Módulo' );
   	Zend_Debug::dump( $request -> getControllerName(), 'Controller' );
   	Zend_Debug::dump( $request -> getActionName(), 'Action' );

*/
   	if ( $request -> getModuleName() != 'default' )
   	{
       	$controller = "";
       	$action = "";
       	$module = "";
       	/*if ( ! $this -> _auth -> hasIdentity() )
       	{
           	$controller = $this -> _notLoggedRoute [ 'controller' ];
           	$action = $this -> _notLoggedRoute [ 'action' ];
           	$module = $this -> _notLoggedRoute [ 'module' ];
       	}
       	else */if ( ! $this -> _isAuthorized( $request -> getModuleName(),$request -> getControllerName(), $request -> getActionName() ) )
       	{
           	$controller = $this -> _forbiddenRoute [ 'controller' ];
           	$action = $this -> _forbiddenRoute [ 'action' ];
           	$module = $this -> _forbiddenRoute [ 'module' ];
       	}
       	else
       	{
           	$controller = $request -> getControllerName();
           	$action = $request -> getActionName();
           	$module = $request -> getModuleName();
       	}
       	$request -> setControllerName( $controller );
       	$request -> setActionName( $action );
       	$request -> setModuleName( $module );
   	}
}

protected function _isAuthorized( $module,$controller, $action )
{
   	$this -> _acl = Zend_Registry::get( 'acl' );
   	$user = $this -> _auth -> getIdentity();
   	if ( ! $this -> _acl -> has( $controller ) || ! $this -> _acl -> isAllowed( $user, $controller, $action ) || ! $this -> _acl -> isAllowed( $user, $module, $controller ) )
       	return false;
   	return true;
}

}

 

vamos fazer uma coisa? como eu faria com controllers? ou tem como deixar alguns destes modulos abertos...? acho que um sistema em modulos ficaria mais organizado, mas so vejo solucao usando conrtrolers.acabo de verificar q ele nao esta fazendo logou, ou esta permitindo a entrada do usuario, direto no modulo admin...no projeto q estou fazendo modular, ja o q estou fazendo por controller nao esta tendo problema, so de permissao...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, acho que você precisa tentar entender como funciona o Zend_Acl. Vou tentar explicar de forma simples.

 

Ele é baseado em Recursos, sendo que cada recurso pode ter 1 ou mais privilégios. No caso do tutorial/artigo que você está seguindo, ele segue o princípio que cada Controller é um Recurso, e cada action deste controller é um privilégio deste recurso.

 

O problema do seu caso acontece quando você tem controllers com o mesmo nome em módulos diferentes (index, por exemplo).

 

$this->_acl->addResource( new Zend_Acl_Resource('auth') )

Quando você faz isto você está criando um recurso chamado auth (que no caso é o Controller Auth).

 

$this -> _acl -> allow( 'guest', 'auth', array( 'index', 'login' ) )

 

Ao fazer isto, você está permitindo (método allow) ao Papel - Role (Perfil de usuário) guest - primeiro parâmetro - o acesso ao recurso auth - secundo parâmetro - , mas está sendo permitindo somente os privilégios index e login deste recurso - terceiro parâmetro.

 

Todas as vezes que você tiver um controller com o mesmo nome em dois módulos diferentes, você terá problemas, porque o método isAllowed() funciona da seguinte forma:

$this -> _acl -> isAllowed( $user, $controller, $action )

 

Onde o primeiro parâmetro é o Papel (Role -> Perfil do Usuário), o segundo parâmetro é o Recurso e o terceiro parâmetro é o privilégio. Como o controller tem o mesmo nome para ambos os módulos (Admin e Blog), quando você define permissão para um deles o outro também passa a ter permissão, criando este erro.

 

Outra coisa que acontece é que você está definindo os recursos como sendo o nome do módulo (blog e admin), mas está testando o nome do recurso como sendo o nome do controller. Trocar esta parte vai funcionar, mas vai te dar problemas mais pra frente, quando você definir permissões diferentes para cada grupo de usuário em cada módulo.

 

Minha sugestão para arrumar (que é a mesma que eu dei antes e você não entendeu, então vou explicar melhor agora):

 

  • Ao invés de usar controller como recurso, use uma concatenação entre modulo e controller. Ex.: Ao invés de Recurso noticia, você usa admin-noticia e blog-noticia
  • Na hora de verificar no isAllowed(), você faz a concatenação entre o nome do módulo + controller

 

Compreendeu a lógica do negócio?

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu li com mais calma o tutorial, fiz usando o zend tool, e consegui fazer com controllers, separar uma parte publica da privada, porem nao tem efeito de permissao, o escritor acessa o admin, onde nao deveria acessar...

 

<?php

class Aplicacao_Acl_Setup
{
/**
	* @var Zend_Acl
	*/
protected $_acl;

public function __construct()
{
   	$this->_acl = new Zend_Acl();
   	$this->_initialize();
}

protected function _initialize()
{
   	$this->_setupRoles();
   	$this->_setupResources();
   	$this->_setupPrivileges();
   	$this->_saveAcl();
}

protected function _setupRoles()
{
   	$this->_acl->addRole( new Zend_Acl_Role('guest') );
   	$this->_acl->addRole( new Zend_Acl_Role('writer'), 'guest' );
   	$this->_acl->addRole( new Zend_Acl_Role('admin'), 'writer' );
}

protected function _setupResources()
{
   	$this->_acl->addResource( new Zend_Acl_Resource('auth') );
   	$this->_acl->addResource( new Zend_Acl_Resource('index') );
   	$this->_acl->addResource( new Zend_Acl_Resource('error') );
   	$this->_acl->addResource( new Zend_Acl_Resource('blog') );
   	$this->_acl->addResource( new Zend_Acl_Resource('admin') );
   	$this->_acl->addResource( new Zend_Acl_Resource('noticias') );
}

protected function _setupPrivileges()
{
   	$this->_acl->allow( 'guest', 'auth', array('index', 'login') )
              	->allow( 'guest', 'index', 'index' )
              	->allow( 'guest', 'noticias', 'index' )
              	->allow( 'guest', 'error', array('error', 'forbidden') );
   	$this->_acl->allow( 'writer', 'blog', array('index', 'adicionar') )
              	->allow( 'writer', 'auth', 'logout' );
   	$this->_acl->allow( 'admin', 'admin', array('index', 'adicionar') );
}

protected function _saveAcl()
{
   	$registry = Zend_Registry::getInstance();
   	$registry->set('acl', $this->_acl);
}
}

?>

 

 

quando eu fiz o primeiro acesso, ate acessou certinho como deveria, mas quando eu coloquei o noticias deu pau, ele nao bloqueia o escritor para o admin, ele permite...e nao deveria permitir o escritor para o admin...

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu to tentando fazer de duas maneiras aki (por modulos e por controllers), so q esta fficando meio confuso, peço a você q encerre o topico, q eu vou tentar fazer de uma maneira so...qq coisa eu abro um outro topico...

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu consegui fazer como o tutorial, mas ao colocar mais recursos teve dois efeitos colaterais...

1- o usuario escritor, acessa o controller admin, onde nao deveria acessar,

2- o usuario guest acessa o blog/index quando deveria acessar so o blog/view

 


<?php


class Aplicacao_Acl_Setup
{
/**
	* @var Zend_Acl
	*/
protected $_acl;

public function __construct()
{
   	$this->_acl = new Zend_Acl();
   	$this->_initialize();
}

protected function _initialize()
{
   	$this->_setupRoles();
   	$this->_setupResources();
   	$this->_setupPrivileges();
   	$this->_saveAcl();
}

protected function _setupRoles()
{
   	$this->_acl->addRole( new Zend_Acl_Role('guest') );
   	$this->_acl->addRole( new Zend_Acl_Role('writer'), 'guest' );
   	$this->_acl->addRole( new Zend_Acl_Role('admin'), 'writer' );
}

protected function _setupResources()
{
   	$this->_acl->addResource( new Zend_Acl_Resource('index') );
   	$this->_acl->addResource( new Zend_Acl_Resource('auth') );
   	$this->_acl->addResource( new Zend_Acl_Resource('error') );
   	$this->_acl->addResource( new Zend_Acl_Resource('blog') );
   	$this->_acl->addResource( new Zend_Acl_Resource('admin') );

}

protected function _setupPrivileges()
{

   	$this->_acl->allow( 'guest', 'auth', array('index', 'login') )
              	->allow( 'guest', 'error', array('error', 'forbidden') );
   	$this->_acl->deny('guest','blog','index');
   	$this->_acl->allow( 'writer', 'blog', array('index', 'adicionar') )
              	->allow( 'writer', 'auth', 'logout' );
   	$this->_acl->allow( 'admin', 'admin', array('index', 'adicionar') );
}

protected function _saveAcl()
{
   	$registry = Zend_Registry::getInstance();
   	$registry->set('acl', $this->_acl);
}
}

 

eh...consegui, mas tive q fazer a verificacao de identidade na index do blog, deixando a viewAction sem verificar isso, para o q o zend faz, ficou gambiarrado...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.