Olá novamente. Como prometido, vou dar continuidade a série de tutoriais sobre o codeigniter. O primeiro deles será um simples e eficaz sisteminha de login utilizando banco de dados para sua aplicação. Parece simples, e realmente é, mas quase toda aplicação necessita de uma área de autenticação, logo, é importante. Sem mais delongas, vamos ao que interessa.
Vou dividir este tutorial nas seguintes partes: Lógica, Controller, View, Model. Prontos? Eu tô, simbora!
Infelizmente, terei que QUEBRAR esta segunda parte em partes =). Como?!
Seguinte, ficou muito extenso nosso tutorial, então estarei quebrando em pelo menos 2 partes o restante do tutorial de login.
Observação: Neste sisteminha, utilizaremos uma biblioteca chamada auth desenvolvida por mim para auxiliar a manipulação e recuperação de informações de um usuário logado.
Faça o download do código da auth aqui:
Lógica
Como muitos sabem, a lógica de um autenticação é bem simples.
- [form] Usuário se depara com um formulário de login/senha
- [usuário] Ele preenche o formulário para efetuar sua autenticação
- [validação] Caso ele esqueça de alguma coisa ou forneça algum dado inválido, o sistema volta a tela de formulário para uma nova tentativa.
- [validação] Se as informações estiverem corretas, o procura pelas mesmas no banco e retorna verdadeiro ou falso para o casamento de “login” e “senha” do usuário no banco de dados.
- [retorno] Caso verdadeiro, a sessão é setada como o usuário está logado e ele é redirecionado para alguma parte do website.
- [retorno errado] Caso falso, voltamos a tela de formulário para mais uma tentativa.
Basicamente será esta a lógica adotada para nosso sisteminha. Utilizaremos o plugin de validação nativo do codeigniter para server-side e mostrarei um dica de validação com o plugin validation do jQuery para uma validação client-side.
Controller
Tendo nossa lógica em mente,vamos agora nos preparar para receber as informações do formulário e fazer a regra de negócio. Para quem não tem muita experiência, o controller é um intermediador de informações e regras de negócio de sua aplicação, agindo entre as VIEWS e os MODELS. Nosso controller terá a seguinte estrutura básica:
Métodos:
Index()
- Nosso método inicial servirá tanto para mostrar o formulário ao usuário, como para executar a ação de login para o usuário.
logout()
- Este método ficará responsável pelo fechamento da sessão da autenticação do usuário.
Código:
class Login extends Controller
{
private $params;
private $username;
private $password;
private $user_info;
/**
* Aqui temos nosso construtor carrregado o Model de Login
* que será abordado em seguida no tutorial.
**/
function Login()
{
parent::Controller();
$this->load->model('login/loginModel'); //Model login
}
function Index()
{
/**
* Utilização da biblioteca auth para chegar se o usuário está logado.
* A passagem do parâmetro TRUE na função é para que a função retorne
* booleano, caso contrário, ela redirecionará a página para outra.
**/
if ($this->auth->check_logged(true) == true) {
//Caso o usuário esteja logado, será redirecionado para a home.
redirect('/home', 'refresh');
} else {
//Carrega o HELPER para auxiliar a passagem de informações REQUEST
$this->load->helper('form');
/**
* Aqui diferenciamos o carregamento do formulário ou a execução
* das ações do controller na hora de efetuar a autenticação.
* Há uma checagem se um parâmetro POST foi passado.
* Caso verdadeiro, o sistema dará continuidade ao login;
* Caso falso, o sistema carrega o formulário de autenticação HTML
**/
if ($_POST) {
/**
* Com o auxílio do HELPER form, podermos capturar o valor dos
* campos 'login' e 'senha', passando o segundo parâmetro como
* 'true', para que já haja métodos de segurança XSS
**/
$this->username = $this->input->post('login', true);
$this->password = $this->input->post('password', true);
//Verificação se os campos foram passados em branco
if (!empty($this->username) || !empty($this->password)) {
/**
* Se os campos foram passados corretamente, nesta fase utilizaremos
* para chegar se o usuário existe no banco de dados.
* O método checkLogin() foi projetado para trazer 'false' caso o
* usuário não exista, ou um 'objeto' de todas as informações do
* usuário no banco de dados, facilitando agora a inserção das
* mesmas informações na sessão do usuário autenticado.
**/
if ($this->user_info = $this->loginModel->checkLogin($this->username, $this->
password)) {
/**
* Após atribuir as informações do usuário, através da biblioteca
* de sessão do CI, alimentamos um array de informações do usuário
* na sessão. Nesta fase, o usuário acaba de se logar.
**/
$this->session->set_userdata('user_logged', array('user_id' => $this->user_info->
id, 'user_name' => $this->user_info->name, 'user_email' => $this->user_info->
email, 'user_status' => $this->user_info->status, 'user_privileges' => $this->
user_info->privileges, 'logged' => 1, 'login_start' => date('Y-m-d H:i:s')));
//Após o login, o usuário é redirecionado para o controller home.
redirect('/home/', 'refresh');
} else {
redirect('/login/', 'refresh');
}
} else {
redirect('/login/', 'refresh');
}
} else {
//Caso não seja setado o $_POST, o formulário de login é mostrado.
$this->layout->view('login/login');
}
}
}
function logout()
{
//O método logout retorna booelano para o fechamento da sessão e redireciona o usuário
if ($this->loginModel->logout()) {
redirect('/login/', 'refresh');
} else {
redirect('home/', 'refresh');
}
}
}
Mais mastigado que isso? Aaa, fala sério! Filé de tilápia, suprassumo do rabo do pato!
Bom, este foi nosso controller. Um pouco extenso pelo uso dos comentários.
Aqui finalizamos a primeira parte do Sistema de Login. Veremos a seguir o Model de nossa aplicação e nosso formulário HTML. E lógico, disponibilizarei as tabelas utilizadas neste exemplo.
Até já.



Como usar autenticação no framework Spaghetti?
class Users extends Controller{
public function login(){
$this->AuthComponent->login();
}
public function logout(){
$this->AuthComponent->logout();
}
}
http://spaghettiphp.org/screencasts/3
Meu amigo, como você deve ter lido, a série é sobre o codeigniter, mas você pode acessar o http://spaghettiphp.org/ e lá tirar suas dúvidas. Quem sabe eu não faço uma série sobre o spaghetti? Mas não agora, agradeço pelo comentário.
Fico feliz em poder ajudar. Em breve mais tutoriais. Valeu!
Boa tarde,
Estou fazendo minha primeira tentativa com o CodeIgniter e este tutorial está me ajudando muito.
Parabéns!
Boa tarde,
Estou tendo o seguinte problema:
========================
A PHP Error was encountered
Severity: Notice
Message: Undefined property: Login::$auth
Filename: login/login.php
Line Number: 28
————————
Fatal error: Call to a member function check_logged() on a non-object in C:\xampp\htdocs\pitblackdog\system\application\controllers\login\login.php on line 28
========================
Aparentemente não está carregando a biblioteca automaticamente [normalmente eu carrego minhas bibliotecas manualmente utilizando "$this->load->library('minhaclasse');" ].
Eu deixei-a em “application/libraries/Auth.php”.
Poderia especificar no seu artigos o nome e o diretório em que os arquivos precisam permanecer para o funcionamento correto?
Obrigado!
Já consegui resolver o problema acima, mas agora estou tendo problema no formulário:
O que é ?
Qual o problema no formulário amigo?