Segunda-feira, Novembro 22, 2010

Sistema de gerenciamento de login e controle de usuário com spaghetti*

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: