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

Eu acabo de reproduzir o tutorial de autorizacao com o zend (http://imasters.com.br/artigo/18025/zend/autorizacao-com-zend-framework) porem acabei de me deparar com um pequeno problema: eu so tenho paginas de acesso restrio, nao tenho paginas de acesso livre, alguem teria ideia de como fazer? nem o manual do zendo esta ajudando....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi qual o problema. Se todas as páginas são de acesso restrito, basta restringir todas as páginas. Como tentou fazer e qual foi o problema encontrado?

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu fiz exatamente igual, so q em algumas paginas eu kero acesso restrito, em outras nao, e o sistema esta colocando todas as paginas como restritas...so kero restricao em algumas...

Compartilhar este post


Link para o post
Compartilhar em outros sites

...eu so tenho paginas de acesso restrio, nao tenho paginas de acesso livre...

 

... so q em algumas paginas eu kero acesso restrito, em outras nao, e o sistema esta colocando todas as paginas como restritas...so kero restricao em algumas...

 

Amigo, fica difícil de ajudar assim... Você quer restringir TODAS as páginas e só está restringindo algumas ou você quer restringir ALGUMAS e está restringindo todas?

 

Pra ficar mais fácil de te ajudar, é melhor você explicar o que está tentando fazer. Um site com painel administrativo, por exemplo, onde o site é aberto e o painel é restrito. Seria algo neste sentido? Ou alguma coisa diferente?

 

Com mais informações fica mais fácil de ajudar, senão fica difícil.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites
Você quer restringir TODAS as páginas e só está restringindo algumas ou você quer restringir ALGUMAS e está restringindo todas?

 

eu quero a segunda opcao, seria um site com painel administrativo, sendo que neste caso, seria um painel administrativo multinivel...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Está trabalhando com módulos? Se sim, o site está em um módulo e o painel em outro?

 

Caso seja esta a situação, você pode fazer a verificação no plugin apenas para os módulos diferentes de default. Algo assim:

 


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

 

Algo neste sentido, onde 'default' é o módulo do site.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que você já tem pronto? O site está pronto? O painel está pronto? Tem alguma coisa? Como está a estrutura do projeto (pastas, arquivos...)?

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

nao tem nada certo, digo no ar, funcionando, eu apenas copiei e colei o tutorial, (http://imasters.com.br/artigo/18025/zend/autorizacao-com-zend-framework), eu estava tentando estudar login multinivel, me deparei com este problema...

 

peloq vi na net, a autenticcacao foi feitoa por modulos, mas eu nao gostaria de fazer um sistema por modulos, nao agora..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, tá difícil de entender a situação em que você está. Por consequência, está difícil de te ajudar. Para trabalhar com um site/painel administrativo, o melhor é criar 2 módulos, sendo um o default, para o site, e o outro admin (ou qualquer outro nome), para o painel.

 

O sistema de permissão do tutorial se baseia em controller/action. O que você pode fazer é adicionar os controllers/actions permitidos para usuários não logados como resource. Depois você define as permissões para o grupo "guest".

 

   protected function _setupResources()
   {
       $this->_acl->addResource( new Zend_Acl_Resource('auth') )
                  ->addResource( new Zend_Acl_Resource('error') )
                  ->addResource( new Zend_Acl_Resource('noticias') )
                  ->addResource( new Zend_Acl_Resource('usuarios') )
                  ->addResource( new Zend_Acl_Resource('qualquer-coisa') )
                  ->addResource( new Zend_Acl_Resource('outra-coisa') );
   }
   protected function _setupPrivileges()
   {
       $this->_acl->allow( 'guest', 'auth', array('index', 'login') )
                  ->allow( 'guest', 'error', array('error', 'forbidden') )
                  ->allow( 'guest', 'qualquer-coisa')
                  ->allow( 'guest', 'outra-coisa');
       $this->_acl->allow( 'writer', 'noticias', array('index', 'adicionar') )
                  ->allow( 'writer', 'auth', 'logout' );
       $this->_acl->allow( 'admin', 'usuarios', array('index', 'adicionar') );
   }

 

No plugin você remove a parte da verificação que joga para tela do usuário não-logado (primeiro if). Fica meio feio, mas com base no que você passou é a melhor alternativa que eu consigo pensar.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara, nao rolou nem com modulos, estou colocando os codigos pra você ver

 

http://www.aviolnista.mus.br/zendnetb.zip

http://www.aviolnista.mus.br/zftools1login.rar

http://www.aviolnista.mus.br/zftools.zip

 

nao rolou nem com modulos e nem com controllers...quando coloco permisao, ele simlesmente tranca todas paginas de modulos e controllers..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, eu não vou baixar vários arquivos, extraí-los e criar um projeto só para ver o que você está fazendo. Faça o seguinte:

 

  • Poste um print screen da estrutura de diretórios/arquivos do seu projeto.
  • Poste como ficou o arquivo que contém a classe Aplicacao_Acl_Setup (ou o nome que você deu pra ele).
  • Poste como ficou o código do plugin que faz a verificação de permissão.

 

Com isto dá pra tentar te ajudar.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

zendacls.png

 

 


aplication_acl_setup


<?php

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

/**
* Description of Setup
*
* @author igor
*/
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( 'admin' ) );
   	$this -> _acl -> addResource( new Zend_Acl_Resource( 'blog' ) );
   	$this -> _acl -> addResource( new Zend_Acl_Resource( 'error' ) );
   	$this -> _acl -> addResource( new Zend_Acl_Resource( 'auth' ) );
   	$this -> _acl -> addResource( new Zend_Acl_Resource( 'index' ) );
}

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

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

}


 

 


aplicacao plugin auth


<?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' 	=> 'ihdex'
);
/**
	* @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)
{
   	$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;
}
}

 

 

desculpa, achei q se você visse o codigo completo, ficaria melhor pra achar o erro,esse dae eh o modular, ele nao esta trancando o modulo q kero, que seria o admin, se der mostre como ficaria pra restringir tambem o blog, mas deixando o index aberto...

 

esqueci de postar os controllers do admin

 

admin.png

Compartilhar este post


Link para o post
Compartilhar em outros sites

Só mudar o plugin, como eu falei lá no post #8.

 

<?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' => 'ihdex' 
);
/**
 * @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) {
	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 );
	}
}

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;
}
}

 

Assim ficou "preso" os módulos admin e blog.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Debugando:

 

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');
               exit ();
               if ($request->getModuleName () != 'index') {

 

Tente entrar em uma página do módulo index. Copie a saída e cole aqui. Tente entrar em uma página do módulo blog e faça a mesma coisa, assim como uma página do módulo admin.

 

Vamos localizar onde está o erro.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

modulo index

 

Módulo string(7) "default" Controller string(5) "index" Action string(5) "index"

 

 

modulo admin

 

Módulo string(5) "admin" Controller string(5) "index" Action string(5) "index"

 

modulo blog

 

Módulo string(4) "blog" Controller string(5) "index" Action string(5) "index"

 

essas sao as saidas...

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olha, na verdade ele deveria ter bloqueado todas as páginas, já que foi eliminado a autorização para o módulo "index", sendo que o nome do módulo é "default".

 

Troque isto. De resto, é só debugar o código agora, pra entender o que está acontecendo. A lógica está certa.

 

Carlos Eduardo

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.