Como pediram to colocando aqui a forma de gerenciamento de login usando session sem o auth component. Não é nada complicado, aliás, é simples demais, gostaria de opiniões sobre a segurança.
Primeiro tá tabela no banco:
CREATE TABLE IF NOT EXISTS `users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`permission` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
);
O model é o mais simples possível:
class Users extends AppModel {}
?>
O controle de login eu faço na home ou num controller de login. Depende do número de ambientes. O projeto que eu to usando como base aqui tem 3 tipos de permissão de usuário, então coloquei no home controller de cada sessão
public function admin_index(){
$this->layout = 'login';
if(isset($_SESSION['permission']) and $_SESSION['permission'] == 'admin' and $_SESSION['loged'] == 1){
$this->redirect("/admin/qualquer-coisa");
}
elseif(!empty($this->data)){
$this->data["password"] = Security::hash($this->data["password"], "sha1", true);
$result = $this->Users->all(array(
'conditions'=>array(
'username'=>htmlspecialchars($this->data['username']),
'password'=>$this->data['password'],
'permission'=>'admin')
));
if(sizeof($result)){
$_SESSION['loged'] = 1;
$_SESSION['permission'] = 'admin';
$this->redirect("/admin/qualquer-coisa");
}
else{
$this->set("errorMessage", "Usuario ou senha incorretos. Tente novamente");
}
}
}
/**
* Metodo de logout para todas as areas
*/
public function logout(){
session_destroy();
$this->redirect("/");
}
?>
A View é básica é obvia, é só um form com nome de usuário e senha:
<div class="login">
<h1>Area do Administrativah1>
<h2>Digite seu nome de usuario e senhah2>
echo $form->create() ?>
echo $form->input("username", array(
'label'=>'Usuario', 'div'=>null));
echo $form->input("password", array(
'label'=>'Senha', 'div'=>null, 'type'=>'password'));
?>
echo $form->close("Login") ?>
if(isset($errorMessage)){ ?>
<br/>
echo "$errorMessage"; ?>
} ?>
div>
E finalmente pra direcionar o usuário, o before filter:
public function beforeFilter (){
if($this->params['prefix'] == "admin"){
if($this->params['here'] != '/admin'){
if($_SESSION['permission'] != 'admin'){
$this->redirect('/admin');
}
}
}
}
Enfim, nada complicado. Única coisa que não vou colocar aqui é que precisa iniciar a sessão, e isso eu fiz no index da webroot (session_start()).
Qualquer consideração, coment.
Claro que algumas melhorias poderiam ser feitas, mas coloquei aqui só a essencia da coisa. Peço desculpas pelo layout horrível do texto. Em breve (mais um ano ou dois) eu migro pro wordpress e dou um jeito nisso.

0 comentários:
Postar um comentário