PHP DO BÁSICO AO AVANÇADO – AULA 16 – Controle de Acesso (login) e Funções de HASH
Nesta aula, vamos abordar um tema que é parte crucial da implementação de um sistema baseado em internet, e também, um tema que é muitas vezes negligenciado, que é o controle de acesso ou login. Através dele é que temos a ciência de quem está acessando ou tentando acessar nosso sistema, e baseado nisso, damos as permissões ou negamos o acesso, a cada um dos conteúdos do nosso sistema.
De posse dessas informações, você pode entender a importância da implementação correta dessa ferramenta, e claro, tomar os devidos cuidados com o tratamento das informações e correto gerenciamento dos dados dos usuários e dos perfis de acesso. Por isso, antes de abordar o código usado para essa parte do sistema, vamos entender os conceitos do controle de acesso e as ferramentas usadas para fazer esse controle com o máximo de segurança possível para nosso sistema, e para nossos usuários, garantindo um ponto de equilíbrio entre cada uma das técnicas.
A complexidade ou simplicidade desse processo é totalmente dependente do tipo de dados que estamos guardando em nosso sistema, na quantidade de usuários, na frequência de login destes e do tipo de controle que queremos ter. Este é um dos motivos que usar a abordagem correta faz toda a diferença tanto na otimização dos recursos como no manuseio correto dos dados. Existem diversas abordagens possíveis para realizar a autenticação de usuários e sistemas web, sendo algumas mais simples e outras mais complexas.
Nossa abordagem, vai basear o controle de login em um método simples, de média complexidade e segurança, que pode ser estendido facilmente adicionando uma ou mais camadas extras de segurança e complexidade que futuramente vamos implementar. Nosso login, será baseado em um nome de usuário, que será um email, que deverá ser checado por uma validação (enviamos um código que será digitado pelo usuário no primeiro login), e uma senha alfanumérica que será salva em nosso banco de dados, de maneira criptografada com um HASH de password.
Para isso, usaremos algumas funções do PHP que vão servir como geradores de senhas, e hash de senhas e password, propositalmente usaremos alguns recursos, para poder exemplificar algumas funções e recursos da linguagem.
Antes, vamos voltar a editar nosso arquivo .htaccess e acrescentar a ele o redirecionamento para o tratamento de erros do HTTP pelo nosso framework, basta acrescentar nas ultimas linhas o seguinte conteúdo:
# Define os erros personalizados #Lembre-se de usar o diretório/site do seu projeto ErrorDocument 401 https://servja.brasap.com.br/index.php?route=main/401 ErrorDocument 403 https://servja.brasap.com.br/index.php?route=main/403 ErrorDocument 404 https://servja.brasap.com.br/index.php?route=main/404 ErrorDocument 500 https://servja.brasap.com.br/index.php?route=main/500
Este código, simplesmente vai direcionar todos os erros do apache para o caminho definido, que será nosso control main e as views respectivas dos erros encontrados. Na pasta das views, vamos criar essas 4 views, caso você tenha definido outros erros, lembre-se de criar cada view conforme indicado. Estes erros serão explicados adiante, na criação das views, que são simplesmente arquivos com conteúdo html
/_main/_404_view.php será a mensagem de erro apresentada caso nosso usuário não tenha feito login e requisitado uma página que ele precisa estar logado para poder ver o conteúdo, e a definimos como:
<div class="jumbotron"> <h1 class="display-4">401 - Acesso Não Autorizado!</h1> <p class="lead">O acesso ao conteúdo requisitado é restrito a usuários logados em nosso sistema.</p> <hr class="my-4"> <p>Caso não tenha feito o login, ou não tenha um cadastro em nosso site, acesse o link correspondente e efetue seu login, ou crie uma conta.<br> Ou se preferir, continue navegando em nossos blog ou entre em contato.</p> </div>
Já o conteúdo de _main/_403_view.php é:
<div class="jumbotron"> <h1 class="display-4">403 - Acesso Não Permitido!</h1> <p class="lead">O recurso solicitado não pode ser solicitado dessa maneira, por favor, acesse sua conta e refaça sua requisição.</p> <hr class="my-4"> <p>O conteúdo que você está solicitando, não pode ser solicitado dessa maneira, caso o problema persista, entre em contato com nosso suporte e procure orientação ou faça seu login novamente e tente novamente.</p> </div>
o do _main/_404_view.php é:
<div class="jumbotron"> <h1 class="display-4">404 - Conteúdo Indisponível</h1> <p class="lead">O conteúdo requisitado não foi localizado, ou foi removido, faça uma nova busca utilizando os mesmos termos, ou tente termos diferentes.</p> <hr class="my-4"> <p>Este conteúdo não está mais disponível neste momento, faça uma busca por conteúdo similar, caso não encontre o que está procurando, entre em contato com nosso atendimento e procure orientações.</p> </div>
e por fim, o do _main/_500_view.php é:
<div class="jumbotron"> <h1 class="display-4">500 - Erro Interno ou Sistema Indisponível</h1> <p class="lead">No momento nosso sistema está indisponível e não pode atender sua solicitação.</p> <hr class="my-4"> <p>Nossos administradores do sistema já receberam uma notificação, e estão trabalhando para solucionar o problema o mais rápido possivel.<br> Volte novamente mais tarde para verificar se o problema já foi solucionado, ou, procure outro conteúdo disponível.<br> Desculpe-nos pelo transtorno.</p> </div>
Para finalizar os processos da aula anterior, no menu, criamos também uma view para o conteúdo do link EMPRESA que se chama _main/_empresa_view.php e seu conteúdo também é html com uma mensagem simples:
<h1>ServJa - Plataforma de Serviços</h1> <p>No momento, este projeto não está totalmente finalizado, e somente em uma fase de desenvolvimento, se você ou sua empresa quiserem adquirir ou colaborar com este projeto e apoiar essa idéia ou mesmo expandi-la e torna-la um serviço entre em contato, que teremos imenso prazer em atender.</p>
Novamente, para que este processo todo funcione, devemos criar uma tabela em nosso banco de dados, que vai conter os dados de login e perfil do nosso usuário, bem como seu ID que será usado futuramente para liga-lo a outras tabelas do banco de dados. Sua estrutura será a seguinte:
CREATE TABLE `usuarios_login` ( `id` int(10) UNSIGNED ZEROFILL NOT NULL COMMENT 'Id do Usuário', `email` varchar(255) NOT NULL COMMENT 'email do login', `password` varchar(255) NOT NULL COMMENT 'senha criptografada hash', `pincode` char(8) NOT NULL COMMENT 'pincode gerado de validação do email', `ativado` tinyint(1) NOT NULL DEFAULT 0 COMMENT 'Se foi ou não validado o pincode', `data_cadastro` timestamp NOT NULL DEFAULT current_timestamp() COMMENT 'Timestamp da data/hora do cadastro', `data_modificacao` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT 'Data da Ultima Alteração de senha/email', `data_login` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE current_timestamp() COMMENT 'Data do ultimo login no sistema', `id_perfil` tinyint(4) NOT NULL COMMENT 'Id do Perfil de Cadastro', `ip_acesso` varchar(56) NOT NULL COMMENT 'IP V4 ou V6 ou MAPPED do ultimo acesso', `ip_country` char(3) NOT NULL COMMENT 'Código de PAIS ISO', `details_login` text NOT NULL COMMENT 'JSon Detailed Login Details', `nome` varchar(250) NOT NULL COMMENT 'Nome do Usuário Textual' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='login de usuários do sistema'; ALTER TABLE `usuarios_login` ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `email_login` (`email`); ALTER TABLE `usuarios_login` MODIFY `id` int(10) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT COMMENT 'Id do Usuário'; COMMIT;
Para poder-mos criar o primeiro usuário, que será nosso USUARIO_ROOT e que é o administrador principal e não pode ser alterado/excluído vamos ter que rodar um pequeno script, que vai gerar a senha de acesso dele, como as senhas ficam salvas no BD com uma função HASH e um SALT que é gerado pelo PHP, então, temos que gerar a senha através desse script. Note, caso exista a necessidade posterior de altera-la, você terá que executar este mesmo trecho de código, inserindo a senha, como a função calcula um SALT, mesmo que seja executada diversas vezes com a mesma senha, sempre uma nova string será gerada. Seu conteúdo é:
<?php echo "Algoritmos Disponíveis e Valores de exemplo<br><pre>"; foreach(hash_algos() as $k=>$v){ echo "=> ".$v.var_dump(hash($v, "10203040"))."<br>"; } echo "<br>======= PASSWORD HASH =======<br>"; $senha = "your_password"; $pass = password_hash($senha, PASSWORD_DEFAULT); echo "Passrord: ".$pass."<br>"; if (password_verify($senha, $pass)) { echo 'Senha OK!<br>'; } echo "<br>======= PASSWORD HASH =======<br>"; for($i=1; $i<10; $i++) { echo password_hash($senha, PASSWORD_DEFAULT)."<br>"; } echo "</pre><br>";
Nosso primeiro loop foreach, simplesmente pega todos os algoritmos de hash disponíveis em sua instalação do php e usa a string 10203040 para ser feito o hash por cada um dos algoritmos, essa função só tem um fim didático de exemplificar como algoritmos diferentes produzem saídas diferentes para uma mesma entrada, algumas com maior ou menor custo de processamento, e que são mais ou menos dificeis de serem quebradas.
Algoritmos como os MD, já são facilmente quebrados e não são mais usados para uso com senhas, já os mais usuais são o BCRIPT e os SHA pois geram uma saída mais segura. Para o nosso uso, criamos um segundo bloco que gera um password_hash usando o algoritmo mais indicado ou padrão da sua instalação, e ele é que vamos usar para criptografar nossas senhas a serem salvas no BD. Basta mudar o valor da variavel $senha para a senha desejada para o seu usuário root e pronto.
No fim do script, fodamos um laço for, que criptografa a senha diversas vezes mostrando que a cada hash, um valor diferente é gerado, isso acontece, pois usamos um SALT que é um adicional para a senha, gerado de maneira automática pela função, este valor é salvo junto da string e pode ser usado para a verificação. O próprio PHP se encarrega de tudo, tendo esse par de funções a utilidade de criar a senha, e verificar se ela está correta e validar a autenticação dos nossos usuários.
Este script vai produzir uma saída similar a:
Algoritmos Disponíveis e Valores de exemplo
string(32) "a2de8be85cbf8875a07155f1745c31df"
=> md2
string(32) "a98edfb44c03b7cb1553da583f744bec"
=> md4
string(32) "670f8574bd93dd78bd568dab84c6733a"
=> md5
string(40) "61ff76c0a46c9f653f4b1ee3d251aac860263e15"
=> sha1
string(56) "268949aa5955c9c0a4a9f1556c7fc6d961239af77742480d7168ef79"
=> sha224
string(64) "58f966a9a6f34334c5d70a548d1c04674296c826c5c5162d49425ce2fe9b78cf"
=> sha256
string(96) "63bfb15d209dfb88d5319630ead7405a6f655e8e9d1b4e94aca78334286b236601a9b78425b028ed07b190bc5f167ee1"
=> sha384
string(56) "23bbcc695b0f9ad4dea660867856f6081eec573d626821ec2a08c4e5"
=> sha512/224
string(64) "cbc627890ca6d60ee38626586fd7062f919c245dd59585de00d7dc385676dac6"
=> sha512/256
string(128) "e6ecb29c15b63f878db83ee7936163e4868815723bcec94f457150b435e52ac1e9a281c84a5346ee768dffb5a7943e9ad028f98850abb66addca4bda0669485e"
=> sha512
string(56) "b16c94a1d9736e607c5ffffd6590814cb51bf34050fd8bccf5dd42fc"
=> sha3-224
string(64) "47b0214620253dd87ba76c6cc730ac401862ef95cf8a980713a45d2bae5bb74b"
=> sha3-256
string(96) "d570082e9f11ed9ea00ab87f6f741e86aba954cc23710fb9412583baf3d4f5eb2ec2cf3b8efac18d81532945e7d3f26c"
=> sha3-384
string(128) "235b136d4f0de9c549db62fd2c197b7176373ee820b1348aafa66c1800070db570a6a374c65343f4f1186a8afbc4e6f32458ebc7b7412e3ee8e554aa2eff2a5e"
=> sha3-512
string(32) "71baa8019a00846f221d606bb4a5e2d6"
=> ripemd128
string(40) "9e05892fea93258c24b057fe8b032997a54d34b1"
=> ripemd160
string(64) "e866392fd4ddee6a34a72e7d6edb012b57e1cab6d46d99175430626cdc46496c"
=> ripemd256
string(80) "5c7e7ae653b58ec56906a1d52dcefdc6800fdd5aa4fa652371918832a44bd6b731d595c613f57bda"
=> ripemd320
string(128) "a7b2ff7f0cbddd6138c6e5607fdcb98ece3f20de74bdf208621f1b06206876f3cdc9875685ff5e2fafc333fb8f53c4e244c44d6c37d91c069f695fef85d7dfac"
=> whirlpool
string(32) "39faeec9fcec43680aca2ca37acb5625"
=> tiger128,3
string(40) "39faeec9fcec43680aca2ca37acb562592131a70"
=> tiger160,3
string(48) "39faeec9fcec43680aca2ca37acb562592131a70ab645889"
=> tiger192,3
string(32) "85ab2f606152514ef9269ac35f4475a1"
=> tiger128,4
string(40) "85ab2f606152514ef9269ac35f4475a178653e03"
=> tiger160,4
string(48) "85ab2f606152514ef9269ac35f4475a178653e038e1c4662"
=> tiger192,4
string(64) "0c6a8a462993c125fdd4c003d6fa2c373030fce9b0b23627a9a306ac12d83e6f"
=> snefru
string(64) "0c6a8a462993c125fdd4c003d6fa2c373030fce9b0b23627a9a306ac12d83e6f"
=> snefru256
string(64) "845e1be30d153d23c07490988ac478f169c05642f3035950731733b1cd31a19b"
=> gost
string(64) "d8b83ab1bc3e7d9b26406bba908c23ab3b0ec19cc2fe72be373542e88eb9368d"
=> gost-crypto
string(8) "06f0018b"
=> adler32
string(8) "785eb183"
=> crc32
string(8) "37b3467c"
=> crc32b
string(8) "143e1890"
=> crc32c
string(8) "0d436839"
=> fnv132
string(8) "5bb1c741"
=> fnv1a32
string(16) "19c446a66837a899"
=> fnv164
string(16) "a9f265b59a17c921"
=> fnv1a64
string(8) "99c03ef0"
=> joaat
string(32) "c4d40280729ab9548da5cb2868938aac"
=> haval128,3
string(40) "eef61f6dd176992732851e8efb1a3d9b90b96a08"
=> haval160,3
string(48) "9cdcea045cab0bb43d54ba688f18345b17efbda917a8651d"
=> haval192,3
string(56) "285d7462208c9eb72593e25621580826a2ac0a863d9ae1e22078e84d"
=> haval224,3
string(64) "2f71851fc8770d3900d71224bfefb04f3b7e67ead25ec54522fce97b550eef47"
=> haval256,3
string(32) "3acf4746b47edb081d34c85e5b94533c"
=> haval128,4
string(40) "30a6b614070132ee6975c1227c571efc58d5f612"
=> haval160,4
string(48) "fb3d8447a25dd2cd5ad350694600f7f1c34cbb7d7ef217ce"
=> haval192,4
string(56) "d0e0f2327b7a10f72e048d95473351c1d1f12624d52b1c6a269203a8"
=> haval224,4
string(64) "221d5d30c89763818c7660ca0f9453d23b36b3d90dc4d412fc892e4c1fbc398c"
=> haval256,4
string(32) "42ef9a5e7dd7305e7c94e41d15a405ed"
=> haval128,5
string(40) "ac5da9ce7ff1bbeac2fe1558497702ce1a7bdd13"
=> haval160,5
string(48) "ac5fe4fb3daa87dce0fcdedfd43cd19614a1eeeeefaaab8c"
=> haval192,5
string(56) "efcf0d1a0f4e526a1ac16ef9248ec7abf8c53d4c6c232780eeb5095a"
=> haval224,5
string(64) "49a979d222a89ff524c71bc387dd107dab68b0dc3718fadf45874bb41e81642f"
=> haval256,5
======= PASSWORD HASH =======
Passrord: $2y$10$p3PVAfKP6/WlckLzubUnv.qS1/TBc5xFtPpgXWU7JzOo0T52hWXoe
Senha OK!
======= PASSWORD HASH =======
$2y$10$wLFURbagoBzBacSEfa/0IuZAQFLVCvjDmmLEMLPTpMrttCJpKyXRu
$2y$10$3km3UrlSnBvIzoQT9YYHy.0UrUKP/.4wBlKkWoQXyMqL/nKvcCUeq
$2y$10$7yTWTCrxuP..XBsqbaGt7uTplDLwYAPXPzBCw/9GI/4JBtg5n7ekS
$2y$10$1EH6U/0elymcDNdbRKyRgetQWmjYwp86Zf3yqL1xc2bLUWIrz3wWe
$2y$10$6HTKqX.1XpaIVyda85v9A.2.ujUycYJ0ORPkODDJ.T1s8pEj2sCL2
$2y$10$UttDxo1XIAQrLscNan4a0uIqu1uZGJYfZXCKdH73pWPyGOW6ldbMi
$2y$10$nDupJjkVQcg4EsjNT/XC3.WjUJfjIjNF/X1RLGuKkETnfsPClOQDa
$2y$10$Tv7yS3iGsypZSY7wfohLOec/bnXL8O88czZnPDbglpfpWJ7TYWhRC
$2y$10$IcwvyvZy1ZYTk20.eHcQJeNAyz.sZ7V4nclPuyL1jQ10xksR7tV7y
Agora, vamos incluir nosso primeiro usuário na tabela, usando o valor gerado no nosso script, segue abaixo o comando utilizado, lembrando que o HASH da senha deve ser substituído pelo valor gerado no script, como selecionado nos códigos com a cor vermelha:
INSERT INTO `usuarios_login` (`id`, `email`, `passord`, `pincode`, `ativado`, `data_cadastro`, `data_modificacao`, `data_login`, `id_perfil`, `ip_acesso`, `ip_country`, `details_login`, `nome`, `bloqueio_geral`, `bloqueio_mensagem`) VALUES ('1', '[email protected]', '$2y$10$sT0rb2VVh9K5v4u9CjeyAOupEN43SvIUMwrOW0xCUFToNsiALiOlG', '00000000', '1', current_timestamp(), current_timestamp(), current_timestamp(), '1', '', '', '', 'Administrador Root - Romeu Gomes', '0', NULL);
Para a view da tela de login (/_login/_login_view.php), usamos o seguinte código:
<?php /** * BRASAP FRAMEWORK VIEW - TELA DE LOGIN * View com o formulário de login * php version 7.4.3 * * @category PHP_SimplifiedFrameworkNoOOP * @package BRASAP_LOGIN * @author Romeu Gomes de Sousa <[email protected]> * @license GNU GPL 3.0 - Livre uso e Distribuição * @version GIT: * @link https://brasap.com.br */ ?> <style> .user_card { height: 400px; width: 350px; margin-top: auto; margin-bottom: auto; background: #f39c12; position: relative; display: flex; justify-content: center; flex-direction: column; padding: 10px; box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); -webkit-box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); -moz-box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); border-radius: 5px; } .brand_logo_container { position: absolute; height: 170px; width: 170px; top: -75px; border-radius: 50%; background: #60a3bc; padding: 10px; text-align: center; } .brand_logo { height: 150px; width: 150px; border-radius: 50%; border: 2px solid white; } .form_container { margin-top: 100px; } .login_btn { width: 100%; background: #c0392b !important; color: white !important; } .login_btn:focus { box-shadow: none !important; outline: 0px !important; } .login_container { padding: 0 2rem; } .input-group-text { background: #c0392b !important; color: white !important; border: 0 !important; border-radius: 0.25rem 0 0 0.25rem !important; } .input_user, .input_pass:focus { box-shadow: none !important; outline: 0px !important; } .custom-checkbox .custom-control-input:checked~.custom-control-label::before { background-color: #c0392b !important; } </style> <div class="container h-100"> <div class="d-flex justify-content-center h-100"> <div class="user_card"> <div class="d-flex justify-content-center"> <div class="brand_logo_container"> <img src="<?php echo URL; ?>resources/logo/logo-full.png" class="brand_logo" alt="Logo ServJa"> </div> </div> <div class="d-flex justify-content-center form_container"> <form method="POST" action="<?php echo URL; ?>login/login" onsubmit="spinner.show();"> <div class="input-group mb-3"> <div class="input-group-append"> <span class="input-group-text"> <i class="fas fa-user"></i> </span> </div> <input type="email" name="login" id="login" class="form-control input_user" value="" placeholder="username (e-mail)" required > </div> <div class="input-group mb-2"> <div class="input-group-append"> <span class="input-group-text"> <i class="fas fa-key"></i> </span> </div> <input type="password" name="passw" id="passw" class="form-control input_pass" value="" placeholder="password" required> </div> <div class="d-flex justify-content-center mt-3 login_container"> <button type="submit" name="button" class="btn login_btn">Fazer Login </button> </div> </form> </div> <div class="mt-4"> <div class="d-flex justify-content-center links"> Ainda não tem uma Conta? <a href="#" class="ml-2">CRIAR CONTA</a> </div> <div class="d-flex justify-content-center links"> Esqueceu a Senha? <a href="#">RECUPERAR SENHA</a> </div> </div> </div> </div> </div>
Para finalizar, vamos criar o CONTROL que trata os logins/logouts somente com o básico, e estendere-mos as funcionalidades na próxima aula, para ser mais didático, o conteúdo do arquivo é:
<?php /** * BRASAP FRAMEWORK LOGIN_CONTROL * Controle de login e sessão de usuários * php version 7.4.3 * * @category PHP_SimplifiedFrameworkNoOOP * @package BRASAP_LOGIN * @author Romeu Gomes de Sousa <[email protected]> * @license GNU GPL 3.0 - Livre uso e Distribuição * @version GIT: * @link https://brasap.com.br */ switch ($route[1]) { case 'login': //se usuário requisitou a tela LOGIN if ($_SESSION['logado']<>'0') { // SE EXISTE UM PERFIL LOGADO, MOSTRA O MINHA CONTA E NÃO FAZ LOGIN $_SESSION['view']='minhaconta'; $_SESSION['erro_no'] = 3; $_SESSION['erro'] = 'Usuário já logado, faça LOGOFF para saír.'; return; } if (isset($_POST['login']) && isset($_POST['passw'])) { // se as variáveis foram preenchidas, vamos recebe-las e buscar no SQL $pr['email'] = filter_input(INPUT_POST, 'login', FILTER_SANITIZE_EMAIL); $passw = filter_input(INPUT_POST, 'passw', FILTER_DEFAULT); $sql = "SELECT * from usuarios_login where email = :email limit 1"; $rs = sqlQuery($sql, $pr); $r = $rs->fetch(PDO::FETCH_ASSOC); if ($rs->rowCount()==0) { // SE NÃO ACHOU EMAIL, MOSTRA ERRO DE USUÁRIO INVÁLIDO, DANDO SLEEP // PARA RETARDAR AS TENTATIVAS DE FORÇA BRUTA $_SESSION['logado'] = '0'; $_SESSION['view'] = 'login'; $_SESSION['erro_no'] = ERRO; $_SESSION['erro'] = 'USUÁRIO OU SENHA INVÁLIDOS OU NÃO CADASTRADOS'; sleep(rand(3, 7)); //Pausa entre 3 e 6 segundos return; } else { // SE EXISTE O CADASTRO, VERIFICA A SENHA if (!password_verify($passw, $r['password'])) { //PASSWORD INVÁLIDO, PARA TEMPO MAIOR, E DEVOLVE O ERRO DE LOGIN $_SESSION['logado'] = '0'; $_SESSION['view'] = 'login'; $_SESSION['erro_no'] = ERRO; $_SESSION['erro'] = 'SENHA INVÁLIDA'; sleep(rand(5, 10)); //Pausa entre 5 e 10 segundos return; } else { //LOGIN EFETUADO, CONTINUE PARA VERIFICAR OS BLOQUEIOS OU LIBERE $_SESSION['logado'] = $r['id_perfil']; $_SESSION['view'] = 'minhaconta'; $_SESSION['erro_no'] = SUCESSO; $_SESSION['erro'] = 'LOGIN EFETUADO COM SUCESSO!'; break; //CONTINUA O LAÇO PARA VERIFICAR OS BLOQUEIOS } } } else { //se variáveis não existem, abre a view da tela de login $_SESSION['logado'] = '0'; $_SESSION['view'] = 'login'; return; } break; case 'logout': // se requisitou a tela de LOGOUT session_destroy(); session_start(); $_SESSION['logado'] = 0; $_SESSION['view'] = 'login'; $_SESSION['erro_no'] = SUCESSO; $_SESSION['erro'] = 'LOGOUT EFETUADO COM SUCESSO!'; return; case 'minhaconta': // se requisitou a tela de MINHA CONTA, VERIFICA SE LOGADO E LIBERA if ($_SESSION['logado'] <> '0') { $_SESSION['view']='minhaconta'; return; } else { $_SESSION['view']='login'; return; } default: //se não encontrou o método chamado, direciona para o 404 header("Location: ".URL."main/404"); return false; } echo "VERIFICAR SE TEM BLOQUEIOS, SERA IMPLEMENTADO NA PROXIMA AULA!";
O que fazemos nele, é primeiro verificar o que foi chamado através de um switch, que tem como padrão um erro 404. E no nosso caso, o que nos interessa é a chamada de LOGIN, que como mostrado nos comentários, recebe os inputs do formulário, filtra seu conteúdo conforme o tipo e faz as verificações de cadastro. salvando os dados de sessão de login conforme nossas necessidades. Veja, que neste ponto, o login já funciona perfeitamente, porém, na próxima aula, vamos estender a funcionalidade, para fazer outras verificações como se o e-mail já está habilitado (verificado), se ele possui algum bloqueio administrativo (que poderia ser falta de pagamento, suspensão, e qualquer outra coisa que seu sistema precise) além de abrir o espaço para controle por origem, por ip, data/hora entre outros.