Como fazer o Filters no yii para controlar acesso as actions

Pessoal estou desenvolvendo um sistema que estou controlando se o usuario esta logado por $_sessao como eu poderia fazer uma regra de filtro para que eu controle os actions que ele possa ter acesso caso ele nao esteja logado, redirecionar ele para a pagina que tem o login.

eu nao estou usando UserIdentity pois a pagina tem 3 login e cada uma verifica o usuario em uma tabela diferente. Entao resolvi usar o UserIdentity so no bakend.

Entao a minha duvida é como posso fazer isso o filter verifica se a sessao existe ele acessa o action caso não nada ele para apgina do login.

Valew

O jeito mais simples é utilizar um inline filter: http://www.yiiframework.com/doc/guide/1.1/pt/basics.controller#filtro

No seu controller, no método filters() você adiciona o filtro:





public function filters() {

    return array(

        'sessionLogin',

    );

}



Ainda no controller você define o método que será utilizado pelo filtro. Note que o nome do método é filter + nome retornado no método filters()




public function filterSessionLogin($filterChain) {

    if(Yii::app()->session['logged_in']) {

        $filterChain->run();

    } else {

        $this->redirect(array('site/login'));

    }

}



Blz davi,

Mais como eu faria para filter verifique somente em algumas action do meu controller?

Value

no controller


public function filters() 	{    	 

        	return array(         	'accessControl',     	);	 

    	} 	 

    	public function accessRules() 	{    	 

        	return array(        	 

            	array('deny',            	 

                	'actions'=>array('create', 'edit'),            	 

                	'expression'=>'Yii::app()->user->isGuest',//vai negar se user for guest        	 

            	),        	 

            	array('allow',            	 

                	'actions'=>array('delete'),            	 

                	'expression'=>'isset($_SESSION["user"])',//vai liberar se existir session de user        	 

                	),        	 

            	array('deny',            	 

                	'actions'=>array('delete'),            	 

                	'users'=>array('*'),//nega a action delete para qualquer usuario        	 

            	),    	 

        	);	 

    	}

Gustavo, valew pela dica mais desta forma eu ja testei e nao funcionou, entao resolvi fazer um filter, esta forma que o davi citou é muito interessando eu so queria saber como eu faço tipo accessRules colocando as action que é para validar.

Pois como eu disse nao sao todas.

Valeu




public function filterSessionLogin($filterChain) {

    $action=$this->getAction();

    $filteredActions=array('admin','delete','create');

    if(in_array($action,$filteredActions)) {

        //faça algo aqui

    } else {

        return true;

    }

}



Edson, o método accessRules() é utilizado somente pelo filtro accessControl. Por isso não funcionou.

Por padrão, um filtro é executado para todos os métodos. Você pode alterar isso da seguinte maneira:




public function filters() {

    return array(

        'sessionFilter - login, outra_action',

    );

}



Nesse exemplo, o sessionFilter será executado para todas as actions, com exceção das actions login e outra_action.




public function filters() {

    return array(

        'sessionFilter + admin',

    );

}



Já nesse exemplo, o sessionFilter será executado apenas na action admin.

Para mais exemplos de filtros de uma olhada na documentação:

http://www.yiiframework.com/doc/guide/1.1/pt/basics.controller#filtro

valew funcionou!!!