LazyPHP

Tutoriais

Voltar para o índice do fórum

Ver outros tópicos de 'Tutoriais'

[Login] Forçar login para acessar um site e liberar métodos específicos para convidados
Leonardo Vilarinho

3 anos atrás atrás - 28/05/2016

Adicionei no LazyPHP (na versão alpha) uma configuração para forçar o login em um site, ou seja, o usuário só poderá acessar as páginas do site após ter feito o login. Para testar ou habilitar o recurso no seu LazyPHP edite o construtor da classe Run, deixando-o assim:

.
.
.
if (DEBUG_MODE) 
{
	error_reporting(E_ALL);
	ini_set('display_errors', 'On');
} 
else 
	ini_set('display_errors', 'Off');

$action = 'index';
#Comece a edição após essa linha

if (Config::get('forceLogin'))
{
	if(!Session::get('user') or Session::get('user') == null)
	{
		$modulo = "Login";
		$action = "login";
		$notLoginRequired = false;
		if(!empty(Config::get('controllersAllowed')))
		{
			$notLoginRequired = false;

			foreach (Config::get('controllersAllowed') as $key => $value)
			{
				$keyArray = str_split($key);
				$contNumber = 0;

				for ($letter = 0; $letter < $keyArray; $letter ++)
				{
					if(filter_var($keyArray[$letter], FILTER_VALIDATE_INT))
						$contNumber ++;
					else
						break;
				}

				$newKey = mb_substr($key, $contNumber);
				if($_GET['m'] == $newKey and Config::get('controllersAllowed')[$key] ==  $_GET['p'])
					$notLoginRequired = true;
			}
		}
	}

}
else
	$notLoginRequired = true;

if($notLoginRequired)
{
	if (isset($_GET['m'])) 
	{
		$route = Route::checkRoute($_GET['m']);
		# Verifica se existe rota
		if (is_array($route) && ($_GET['p']=='index')) 
		{
			$modulo = $route[0];
			$action = $route[1];
		} 
		else 
		{
			$modulo = $_GET['m'];
			if (isset($_GET['p']))
				$action = $_GET['p'];
		}
	} 
	else 
	{
		$modulo = Config::get('indexController');
		$action = Config::get('indexAction');
	}
}

# A edição termina aqui, é só copiar e colar esse trecho do código entre os comentários e substituir pelo o seu
spl_autoload_register(array($this, 'loader'));
.
.
.
No config.php devemos adicionar duas novas variáveis:

##################################
# CONFIGURAÇÕES ADICIONAIS
# Forçar realização de login
# Indicar controllers e métodos liberados para convidades (aqueles que não tem login)
# Dica: Usar um ID único em cada key do mesmo controller do array 'controllersAllowed',
# para o array não ter indices iguais, o ID sempre deverá ser um NÚMERO.
##################################
# forçar login:
Config::set('forceLogin', true);
# controllers liberados com seus métodos, $key = ID+Controller e $value = metodo:
Config::set('controllersAllowed', array('1Autor' => 'lista', '2Autor' => 'ver', '1Postagem' => 'lista'));
Defini a variável forceLogin, que indicará se estou ou não forçando um login, e a variável controllersAllowed é um array onde os índices indicarão o Controller liberado e o valor será o método daquele Controller que deve ser liberado.
Leonardo Vilarinho

3 anos atrás atrás - 28/05/2016

Não consegui editar a postagem, por isso estou continuando a mesma nessa resposta. Um array padrão em PHP não pode ter índice iguais, então houve a necessidade de colocar um ID para cada regra de acesso, quando um Controller só tem um método liberado esse ID é dispensável. No exemplo, o índice '1Postagem' poderia ser apenas 'Postagem', pois esse controller só tem essa regra, mas por boa prática é melhor colocar o ID da regra. Lembrando que o ID deve ser um número inteiro.
Healfull

3 anos atrás atrás - 30/05/2016

A classe lib/util/Acl.php, da versão Alpha, já não atende a esta necessidade?
Leonardo Vilarinho

3 anos atrás atrás - 30/05/2016

Eu não tinha percebido essa classe, no mais se torna uma outra opção para quem tem a outra versão ou prefere usar essa.
Healfull

3 anos atrás atrás - 30/05/2016

Ah sim, tudo bem, a versão Alpha não esta completamente documentada ainda, tranquilo... No mais obrigado pela contribuição.
Miguel

3 anos atrás atrás - 30/05/2016

Leonardo Vilarinho disse: Eu não tinha percebido essa classe, no mais se torna uma outra opção para quem tem a outra versão ou prefere usar essa.
com certeza. Obrigado pela contribuição
Healfull

3 anos atrás atrás - 30/05/2016

Leonardo, que tal fazer um array multinível para o $controllersAllowed , onde a chave é o controlador e o valor é um array com todos os métodos liberados. A comparação poderia ficar algo como isto:

//Apenas um exemplo. Substituir nos pontos necessários.
$controllersAllowed = array('Autor' => array('lista', 'ver'), 'Postagem' => array('lista'));

        foreach($controllersAllowed as $k => $v){
            if(strcasecmp($k, $_GET['m']) == 0 && array_search(strtolower($_GET['p']), $v)){
                $notLoginRequired = true;
                break;
            }
        }
Adicionei as funções strcasecmp e strtolower para tornar as comparações case insensitives.
Leonardo Vilarinho

3 anos atrás atrás - 24/06/2016

Estava tentando usar o Acl da nova versão mas ele só oculta os links, exemplo o do menu, mas se acessar o link pela url ele permite o acesso
Healfull

3 anos atrás atrás - 04/07/2016

Leonardo Vilarinho disse: Estava tentando usar o Acl da nova versão mas ele só oculta os links, exemplo o do menu, mas se acessar o link pela url ele permite o acesso
No inicio do método beforeRun() do AppController adicione o seguinte trecho:

if(!Acl::check(CONTROLLER, ACTION, Session::get(Acl::$loggedSession))){
            $this->go('Index', 'error'); //Redireciona para a página de erro caso não tenha permissão
        }
Crie o seguinte método na classe index:

public function error(){
            $this->setTitle('Erro 404');
            $this->render('Pages/404'); //Renderiza a página de erro já existente no projeto
	}
E adicione o método no acl:

'Index' => array('index' => true, 'error' => true), //A página de erro tem que ser pública
Healfull

3 anos atrás atrás - 06/07/2016

Resolução final (fonte: http://lazyphp.com.br/Topico/responder/id:227).
Miguel disse: Certo, esqueci de por 3 linhas no AppController na versão de download que já tinha feito em uma versão de testes:

/**
     * Esta função é automaticamente executada antes da execução da funçao do
     * Controller especificado.
     * 
     * Implemente aqui regras globais que podem valer para todos os Controllers
     */
    public function beforeRun() {
        if (!Acl::check(CONTROLLER, ACTION, Session::get(Acl::$loggedSession))) {
            $this->goUrl(SITE_PATH . Acl::$redirectTo);
        }
        if ($this->getParam('ordenaPor')) {
            Session::set(CONTROLLER . ACTION . APPKEY . '.ordenaPor', $this->getParam('ordenaPor'));
        }
        $or = Session::get(CONTROLLER . ACTION . APPKEY . '.ordenaPor');
        if (!empty($or) && !($this->getParam('ordenaPor'))) {
            $this->setParam('ordenaPor', Session::get(CONTROLLER . ACTION . APPKEY . '.ordenaPor'));
        }
    }

Voltar para o índice do fórum

Ver outros tópicos de 'Tutoriais'