Bloqueio de rota administrativa do CakePHP
por João Vagner em 12.03.2009 08:34 Destaques, Geral, Internet, OOP, frameworks, php
Olá Pessoal,
Quem utiliza o Fremwork CakePHP sabe que é uma mão na roda o route admin. Nos poupa um bocado de trabalho criar as funções da administração do site. Isso graças ao “Bake” Porém a rota não pode ficar totalmente acessivel a qualquer um, certo?
O Jonathan Snook escreveu um artigo em relação a isso, porém em alguns testes por aqui nenhum realmente funcionou utilizando .htaccess para proteção dessa rota com password.
Password Protecting Admin Functions in CakePHP.
O Conceito da proteção no artigo do Jonathan Snook é simples, E pode ser gerado com qualquer um que possua acesso ao SSH do site. Não é necessário acesso root para esses tipos de ações no servidor.
Seu servidor não te da acesso ao SSH? Está na hora de mudar para a IW²
O primeiro passo dessa proteção se dá ao inserir seguinte conteúdo no seu .htaccess :
1 2 3 4 | AuthUserFile /diretorio/passwd/protecao AuthName "Administracao CAKE" AuthType Basic Require valid-user |
Com acesso ao ssh utilize o seguinte comando dentro da pasta “www”.
htpasswd -c /diretorio/passwd/protecao username
.
Isso gera um arquivo com a senha criptografada! Caso queira barar o arquivo gerado para verificar fiquem à vontade!
Bons testes, aqui nunca funcionou!
Meu jeitinho
A maneira no qual eu utilizo é a verificação simples de variavel, ou seja, apenas um usuário dentro do código no qual após o POST, verifica os dados, e grava uma sessão, se os mesmos forem iguais.
Primeiro passo é abrir o seu /app/config/routes.php, e crie uma rota chamada admin, usando o controller de páginas estáticas. Veja:
1 | Router::connect('/admin/', array('controller' => 'pages', 'action' => 'display', 'admin')); |
Agora crie um arquivo chamado admin.ctp dentro da pasta /app/views/pages/ com um formulário básico para login e senha:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?php //Define o layout padrão para a página $this->layout = 'admin'; ?> <h1><?php __('Administração');?></h1> <?php // Caso ocorra algum erro, é exibido em sua div correta! if(isset($error)) { echo "<div class='error'>" . $error . "</div>"; } ?> <?php /* criamos um formulário com o vetor User, indicando a rota /admin/login, onde teremos nossa verificação de usuário e senha para registro da sessão da administração, e acesso ao restante dos actions _admin_ */ echo $form->create('User', array('url'=>'/admin/login/')); ?> <fieldset> <legend>Digite os dados</legend> <?php echo $form->input('username', array('label'=>'Login')); ?> <?php echo $form->input('password', array('label'=>'Senha', 'id'=>'Senha')); ?> <?php echo $form->end('Logar!'); ?> </fieldset> </form> |
O próximo passo é criar uma nova rota no /app/config/routes.php, rota no qual foi definida na URL do nosso formulário, onde será submetida os dados para verificação.
1 | Router::connect('/admin/login/', array('controller' => 'users', 'action' => 'admLogin')); |
Claro, obviamente eu já possuo um controller chamado users, caso não tenha, pode cria-lo, utilizando o código abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <?php class UsersController extends AppController { var $name = 'Users'; var $helpers = array('Html', 'Form'); /* Claro, que aqui irão outras actions suas ;) */ function admLogin() { //verifica se o post possui alguma informação para registrar o nosso array com informações if($this->data) { $dbuser = array('username'=='Administrador', 'password'=>'Sua_senha_aqui'); if(($this->data['User']['username'] == $dbuser['username']) && ($this->data['User']['password'] == $dbuser['password'])) { $this->Session->Write('admin', $dbuser); // registra a sessão "admin" para futuras verificações $this->Session->setFlash('Logado com sucesso'); //Notifica o sucesso ao logar! $this->redirect('/admin/users/index'); // redireciona para a action index do controller users. } else { $this->Session->setFlash('Erro! Dados inválidos'); // notifica o erro } } } } ?> |
Note que por enquanto o nosso controller users possui apenas um action. Fica a seu critério a criação do resto do conteúdo ;)
Agora iremos criar a função para verificação da sessão:
1 2 3 4 5 6 7 8 9 | <?php function checkAdminSession() { if (!$this->Session->check('admin')) { $this->Session->setFlash('Você não tem acesso a essa área'); $this->redirect('/admin/login/'); } } ?> |
A minha recomendação é que coloque essa função dentro do arquivo /app/app_controller.php no qual o cake carrega automáticamente. Esse arquivo serve para colocar as funções que vai utilizar em todos os controllers, sem a necessidade de ficar repetindo os mesmos.
Agora vem a parte mais interessante, vamos inserir o beforeFilter(); também dentro do /app/app_controller.php, para verificação do parametro /admin/ na url, e execução da verificação da sessão. Veja:
1 2 3 4 5 6 7 8 | <?php function beforeFilter() { if(isset($this->params['admin'])) { $this->checkAdminSession(); } } ?> |
O que a função faz é: Se existe algum parametro na url “admin”, executa a função checkAdminSession e veja se existe a sessão “admin”. Se não existir a sessão, a checkAdminSession redireciona para login.
Pronto, e assim você tem uma certa segurança em relação a rota /admin/ não estar sendo visualizada por tudo e por todos!
Tags: cakephp, Desenvolvimento web, frameworks


12.03.09 20:59 at 08:59
Bloqueio de rota administrativa do CakePHP…
Olá Pessoal,
Quem utiliza o Fremwork CakePHP sabe que é uma mão na roda o route admin. Nos poupa um bocado de trabalho criar as funções da administração do site. Isso graças ao “Bake” Porém a rota não pode ficar totalmente acessiv…
14.07.09 09:30 at 09:30
Não teria uma forma de deixar o admin com outro CMS e só especificar uma rota pra ele?
Ex: /admin usar um outro sistema, sem ter q ser feito pelo cake.
Até agora o que encontrei sobre isso é que deverá usar um subdomínio, ex: admin.meusite.com/
Abraços
11.08.09 22:09 at 10:09
Olha Mateus eu não consegui imaginar uma situação onde isso pudesse acontecer, embora eu ache que seja possível, mesmo indo meio que contra as convenções do cake.
11.08.09 22:39 at 10:39
E possivel sim, atravez do .htacccess, adicionando regras personalizadas.
Porém terá que desabilitar todas as rotas do Cake.
08.09.09 09:20 at 09:20
Só pra informação: é possível proteger uma rota administrativa (ou qualquer outra, na verdade) usando um .htaccess, de um jeito meio ‘gambiarra’, é verdade.
O procedimento consiste em criar um diretório com o nome da rota (e.g. se sua rota é /admin, você criaria um diretório /caminho/do/cake/admin) e coloca o .htaccess protegendo este novo diretório.
Como o dispatcher do Cake checa pela existência de um arquivo antes de invocar seu sistema de reescrita, o servidor pedirá autorização para que o diretório seja acessado, e você ganha sua autenticação!