Advertisement
Guest User

Usuario.class.php

a guest
Mar 24th, 2018
290
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 16.54 KB | None | 0 0
  1. <?php
  2. /*********************************************************************************************************************************
  3. * AutoLoad Connection
  4. *********************************************************************************************************************************/
  5. require_once(@dirname(dirname(dirname(__FILE__))).'/autoload/AutoLoad.class.php');
  6.  
  7. /*********************************************************************************************************************************
  8. * User Settings
  9. *********************************************************************************************************************************/
  10. class Usuario {
  11.     /**
  12.     * Nome da tabela de usuários
  13.     */
  14.     var $tabela_users = 'pystudio_users';
  15.  
  16.     /**
  17.     * Nomes dos campos onde ficam o usuário e a senha de cada usuário
  18.     * Formato: tipo => nome_do_campo
  19.     */
  20.     var $campos = array(
  21.         'id'            => 'user_id',
  22.         'usuario'       => 'user_login',
  23.         'senha'         => 'user_password',
  24.         'email'         => 'user_email',
  25.         'nome'          => 'user_name',
  26.         'avatar'        => 'user_avatar',
  27.         'descricao'     => 'user_description',
  28.         'status'        => 'user_status',
  29.         'rank'          => 'user_rank',
  30.         'ip'            => 'user_ip',
  31.         'data'          => 'user_date',
  32.         'ultimo_acesso' => 'user_last_access'
  33.     );
  34.  
  35.     /**
  36.     * Nomes dos campos que serão pegos da tabela de usuarios e salvos na sessão,
  37.     * caso o valor seja false nenhum dado será consultado
  38.     * @var mixed
  39.     */
  40.     var $colunas_users = array(
  41.         'user_id',
  42.         'user_login',
  43.         'user_password',
  44.         'user_email',
  45.         'user_name',
  46.         'user_avatar',
  47.         'user_description',
  48.         'user_status',
  49.         'user_rank',
  50.         'user_ip',
  51.         'user_date',
  52.         'user_last_access'
  53.     );
  54.  
  55.     /**
  56.     * Prefixo das chaves usadas na sessão
  57.     * @var string
  58.     */
  59.     var $prefixoChaves = 'usuario_';
  60.  
  61.     /**
  62.     * Inicia a sessão se necessário?
  63.     * @var boolean
  64.     */
  65.     var $iniciaSessao = true;
  66.  
  67.     /**
  68.     * Usa um cookie para melhorar a segurança?
  69.     * @var boolean
  70.     */
  71.     var $cookie = true;
  72.  
  73.     /**
  74.     * Armazena as mensagens
  75.     * @var string
  76.     */
  77.     var $msg = '';
  78.  
  79.     /**
  80.     * Armazena as mensagens de erro
  81.     * @var string
  82.     */
  83.     var $erro = '';
  84.  
  85.     /**
  86.     * Quantidade (em dias) que o sistema lembrará os dados do usuário ("Lembrar minha senha")
  87.     *
  88.     * Usado apenas quando o terceiro parâmetro do método Usuario::logaUsuario() for true
  89.     * Os dados salvos serão encriptados usando base64
  90.     *
  91.     * @var integer
  92.     * @since v1.1
  93.     */
  94.     var $lembrarTempo = 5;
  95.        
  96.     /**
  97.     * Construtor
  98.     *
  99.     * Inicializa a classe e permite a definição de onde os arquivos
  100.     * serão salvos. Se o parâmetro $folder for ignorado o local dos
  101.     * arquivos temporários do sistema operacional será usado
  102.     *
  103.     * @return void
  104.     */
  105.     public function __construct() {}
  106.  
  107.     /**
  108.     * Usa algum tipo de encriptação para codificar uma senha
  109.     *
  110.     * Método protegido: Só pode ser acessado por dentro da classe
  111.     *
  112.     * @param string $senha - A senha que será codificada
  113.     * @return string - A senha já codificada
  114.     */
  115.     protected function __codificarSenha($senha) {
  116.         // Altere aqui caso você use, por exemplo, o MD5:
  117.         // return md5($senha);
  118.         return substr(hash('sha512', $senha), strlen(), 40);
  119.     }
  120.  
  121.     /**
  122.     * Usa algum tipo de encriptação para verificar a codificação de uma senha
  123.     *
  124.     * Método protegido: Só pode ser acessado por dentro da classe
  125.     *
  126.     * @param string $senha - A senha que será verificar
  127.     * @param string $hash - A senha procurada no banco de dados
  128.     * @return string - A senha já verificada
  129.     */
  130.     protected function __verificarSenha($senha, $senha_db) {
  131.         // Altere aqui caso você use, por exemplo, o MD5:
  132.         // return md5($senha);
  133.         return in_array($senha, $senha_db);
  134.     }
  135.  
  136.     /**
  137.     * Verifica os usuários
  138.     *
  139.     * Método protegido: Só pode ser acessado por dentro da classe
  140.     *
  141.     * @param string $usuario - O usuário digitado que passará pelo processo de verificação
  142.     * @param string $user_db - O usuário procurado no banco de dados
  143.     * @return string - O usuário já verificado
  144.     */
  145.     protected function __verificarUsuario($usuario, $user_db) {
  146.         // Altere aqui caso você use, por exemplo, o MD5:
  147.         // return md5($senha);
  148.         return in_array($usuario, $user_db);
  149.     }
  150.    
  151.     /**
  152.     * Loga um usuário no sistema salvando seus dados na sessão
  153.     *
  154.     * @param string $usuario - O usuário que será logado
  155.     * @param string $senha - A senha do usuário
  156.     * @return boolean - Se o usuário foi logado ou não
  157.     */
  158.     public function LogarUsuario($usuario = NULL, $senha = NULL, $redirecionamento = false) {
  159.         // Banco de Dados
  160.         $Conexao = new Conexao();
  161.         $Conexao->Conector();
  162.         $db = $Conexao->IniciarConexao();
  163.         // Instâncias
  164.         $Modulo = new Modulos();
  165.         // Codificação da senha
  166.         $senha = $this->__codificarSenha($senha);
  167.         // Monta o formato SQL da lista de campos
  168.         $dados = join(', ', array_unique($this->colunas_users));
  169.         // Procura por usuários com a mesma senha digitada no formulário
  170.         $stm = $db->prepare('SELECT '.$this->campos['usuario'].' FROM '.$this->tabela_users.' WHERE '.$this->campos['usuario'].' = ?');
  171.         $stm->execute(array($usuario));
  172.         $consulta = $stm->rowCount();
  173.         // Resultado da Consulta
  174.         if ($consulta != NULL) {
  175.             // Consultar os dados no MYSQL
  176.             $stm = $db->prepare('SELECT '.$dados.' FROM '.$this->tabela_users.' WHERE '.$this->campos['usuario'].' = ?');
  177.             $stm->execute(array($usuario));
  178.             $retorno = $stm->fetch();
  179.             // Verificar o(a) usuário/senha do banco de dados com a digitada no formulário
  180.             $LoginUsuario   = Array();
  181.             $LoginUsuario[] = $retorno->user_login;
  182.             $SenhaUsuario   = Array();
  183.             $SenhaUsuario[] = $retorno->user_password;
  184.             // Verificando se a conta já está logada no sistema
  185.             if ($retorno->user_status == 0) {
  186.                 if ($this->__verificarUsuario($usuario, $LoginUsuario) && $this->__verificarSenha($senha, $SenhaUsuario)) {
  187.                     // Iniciar a sessão?
  188.                     if ($this->iniciaSessao AND !isset($_SESSION)) {
  189.                         session_start();
  190.                     }
  191.                     // Passa os dados para a sessão
  192.                     foreach ($retorno AS $chave => $valor) {
  193.                         $_SESSION[$this->prefixoChaves.$chave] = $valor;
  194.                     }
  195.                     // Atualizando o banco de dados - STATUS
  196.                     $Modulo->updateDB(
  197.                         $this->tabela_users,
  198.                         $this->campos['status']         .' = 1, '.
  199.                         $this->campos['ip']             .' = "'.$_SERVER['REMOTE_ADDR'].'", '.
  200.                         $this->campos['ultimo_acesso']  .' = "'.date('Y-m-d H:i:s').'"',
  201.                         $this->campos['usuario']        .' = "'.$usuario.'"'
  202.                     );
  203.                     // Usuário logado com sucesso
  204.                     $_SESSION[$this->prefixoChaves.'logado'] = true;
  205.                     // Define um cookie para maior segurança?
  206.                     if ($this->cookie) {
  207.                         // Monta uma cookie com informações gerais sobre o usuário: usuario, ip e navegador
  208.                         $valor = join('#', array($usuario, $_SERVER['REMOTE_ADDR'], $_SERVER['HTTP_USER_AGENT']));
  209.                         // Encripta o valor do cookie
  210.                         $valor = md5($valor);
  211.                         setcookie($this->prefixoChaves.'token', $valor, 0, '/');
  212.                     }
  213.                     // Log
  214.                     $Modulo->saveLog('Login efetuado com sucesso. <b>('.$usuario.')</b>');
  215.                     // Redirecionamento
  216.                     echo '<script type="text/javascript">setTimeout(location.href = "'.$redirecionamento.'", 0000);</script>';
  217.                 } else if (!$this->__verificarSenha($senha, $SenhaUsuario)) {
  218.                     // Log
  219.                     $Modulo->saveLog('A senha que o usuário <b>('.$usuario.')</b> tentou digitar, não pertence ao nome de usuário.');
  220.                     // Mensagem de erro
  221.                     $this->msg  = 'error';
  222.                     $this->erro = 'A senha não pertence ao usuário.';
  223.                 }
  224.             } else {
  225.                 // Log
  226.                 $Modulo->saveLog('O usuário <b>('.$usuario.')</b> tentou fazer login com sua conta já conectada no sistema.');
  227.                 // Mensagem de erro
  228.                 $this->msg  = 'warning';
  229.                 $this->erro = 'Sua conta já está online no sistema.';
  230.             }
  231.         } else {
  232.             // Consultar os dados no MYSQL
  233.             $stm = $db->prepare('SELECT '.$dados.' FROM '.$this->tabela_users.' WHERE '.$this->campos['senha'].' = ?');
  234.             $stm->execute(array($senha));
  235.             $consulta = $stm->rowCount();
  236.             // Verifica se há registros
  237.             if ($consulta != NULL) {
  238.                 // Retorna os dados do bando de dados
  239.                 $retorno = $stm->fetch();
  240.                 // Verificar o(a) usuário/senha do banco de dados com a digitada no formulário
  241.                 $LoginUsuario   = Array();
  242.                 $LoginUsuario[] = $retorno->user_login;
  243.                 $SenhaUsuario   = Array();
  244.                 $SenhaUsuario[] = $retorno->user_password;
  245.                 // Verifica se o usuário pertence a senha
  246.                 if (!$this->__verificarUsuario($usuario, $LoginUsuario) && $this->__verificarSenha($senha, $SenhaUsuario)) {
  247.                     // Log
  248.                     $Modulo->saveLog('O nome de usuário <b>('.$usuario.')</b> não pertence a senha.');
  249.                     // Mensagem de erro
  250.                     $this->msg  = 'error';
  251.                     $this->erro = 'O usuário não pertence a senha.';
  252.                 }
  253.             } else {
  254.                 // Log
  255.                 $Modulo->saveLog('A conta que tem por usuário <b>('.$usuario.')</b> não existe no banco de dados.');
  256.                 // Mensagem de erro
  257.                 $this->msg  = 'info';
  258.                 $this->erro = 'A conta não existe. <a href="/?pagina=register">Faça seu cadastro!</a>';
  259.             }
  260.         }
  261.  
  262.         // Mensagem de erros
  263.         if (isset($this->msg)) {
  264.             if ($this->msg == 'error') {
  265.                 echo '<div class="callout callout-danger alert alert-dismissible">
  266.                     <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
  267.                     <b>Oh snap!</b> '.$this->erro.'
  268.                 </div>';
  269.             } else if ($this->msg == 'warning') {
  270.                 echo '<div class="callout callout-warning alert alert-dismissible">
  271.                     <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
  272.                     <b>Warning!</b> '.$this->erro.'
  273.                 </div>';
  274.             } else if ($this->msg == 'info') {
  275.                 echo '<div class="callout callout-info alert alert-dismissible">
  276.                     <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
  277.                     <b>Heads up!</b> '.$this->erro.'
  278.                 </div>';
  279.             }
  280.         }
  281.     }
  282.  
  283.     /**
  284.     * Salva os dados do usuário em cookies ("Lembrar minha senha")
  285.     *
  286.     * @access protected
  287.     * @since v1.1
  288.     *
  289.     * @param string $usuario O usuário que será lembrado
  290.     * @param string $senha A senha do usuário
  291.     * @return void
  292.     */
  293.     protected function __lembrarDados($usuario, $senha) {
  294.         // Calcula o timestamp final para os cookies expirarem
  295.         $tempo = strtotime("+{$this->lembrarTempo} minutes", time());
  296.         // Encripta os dados do usuário usando base64
  297.         // O rand(1, 9) cria um digito no início da string que impede a descriptografia
  298.         $usuario = rand(1, 9) . base64_encode($usuario);
  299.         $senha   = rand(1, 9) . base64_encode($senha);
  300.         // Cria um cookie com o usuário
  301.         setcookie($this->prefixoChaves.'lu', $usuario, $tempo, $this->cookiePath);
  302.         // Cria um cookie com a senha
  303.         setcookie($this->prefixoChaves.'ls', $senha, $tempo, $this->cookiePath);
  304.     }
  305.  
  306.     /**
  307.     * Verifica os dados do cookie (caso eles existam)
  308.     *
  309.     * @access protected
  310.     * @since v1.1
  311.     * @uses Usuario::logaUsuario()
  312.     *
  313.     * @return boolean Os dados são validos?
  314.     */
  315.     protected function __verificarDadosLembrados() {
  316.         // Os cookies de "Lembrar minha senha" existem?
  317.         if (isset($_COOKIE[$this->prefixoChaves.'lu']) AND isset($_COOKIE[$this->prefixoChaves.'ls'])) {
  318.             // Pega os valores salvos nos cookies removendo o digito e desencriptando
  319.             $usuario = base64_decode(substr($_COOKIE[$this->prefixoChaves.'lu'], 1));
  320.             $senha   = base64_decode(substr($_COOKIE[$this->prefixoChaves.'ls'], 1));
  321.             // Tenta logar o usuário com os dados encontrados nos cookies
  322.             return $this->LogarUsuario($_SESSION[$this->prefixoChaves.'user_login'], $_SESSION[$this->prefixoChaves.'user_password'], true);
  323.         }
  324.         // Não há nenhum cookie, dados inválidos
  325.         return false;
  326.     }
  327.  
  328.     /**
  329.     * Limpa os dados lembrados dos cookies ("Lembrar minha senha")
  330.     *
  331.     * @access protected
  332.     * @since v1.1
  333.     *
  334.     * @return void
  335.     */
  336.     protected function __limparDadosLembrados() {
  337.         // Deleta o cookie com o usuário
  338.         if (isset($_COOKIE[$this->prefixoChaves.'lu'])) {
  339.             setcookie($this->prefixoChaves.'lu', false, (time() - 3600), $this->cookiePath);
  340.             unset($_COOKIE[$this->prefixoChaves.'lu']);
  341.         }
  342.         // Deleta o cookie com a senha
  343.         if (isset($_COOKIE[$this->prefixoChaves.'ls'])) {
  344.             setcookie($this->prefixoChaves.'ls', false, (time() - 3600), $this->cookiePath);
  345.             unset($_COOKIE[$this->prefixoChaves.'ls']);
  346.         }
  347.     }
  348.  
  349.     /**
  350.     * Verifica se há um usuário logado no sistema
  351.     *
  352.     * @return boolean - Se há um usuário logado ou não
  353.     */
  354.     public function UsuarioLogado() {
  355.         // Inicia a sessão?
  356.         if ($this->iniciaSessao AND !isset($_SESSION)) {
  357.             session_start();
  358.         }
  359.         // Verifica se não existe o valor na sessão
  360.         if (!isset($_SESSION[$this->prefixoChaves.'logado']) OR !$_SESSION[$this->prefixoChaves.'logado']) {
  361.             return false;
  362.         }
  363.         // Verifica cookies salvos
  364.         $this->__verificarDadosLembrados();
  365.         // Faz a verificação do cookie?
  366.         if ($this->cookie) {
  367.             // Verifica se o cookie não existe
  368.             if (!isset($_COOKIE[$this->prefixoChaves.'token'])) {
  369.                 return false;
  370.             } else {
  371.                 // Monta o valor do cookie
  372.                 $valor = join('#', array($_SESSION[$this->prefixoChaves.'user_login'], $_SERVER['REMOTE_ADDR'], $_SERVER['HTTP_USER_AGENT']));
  373.                 // Encripta o valor do cookie
  374.                 $valor = md5($valor);
  375.                 // Verifica o valor do cookie
  376.                 if ($_COOKIE[$this->prefixoChaves.'token'] !== $valor) {
  377.                     return false;
  378.                 }
  379.                 // Lembrar os Dados
  380.                 $this->__lembrarDados($_SESSION[$this->prefixoChaves.'user_login'], $_SESSION[$this->prefixoChaves.'user_password']);
  381.             }
  382.         }
  383.         // A sessão e o cookie foram verificados, há um usuário logado
  384.         return true;
  385.     }
  386.  
  387.     /**
  388.     * Desconecta a conta do sistema
  389.     *
  390.     * @param string $redirecionamento - Redireciona você a uma determinada página
  391.     * @return boolean to usuarioLogado()
  392.     */
  393.     public function LogoutUsuario($redirecionamento = false) {
  394.         // Inicia a sessão?
  395.         if ($this->iniciaSessao AND !isset($_SESSION)) {
  396.             session_start();
  397.         }
  398.         // Tamanho do prefixo
  399.         $tamanho = strlen($this->prefixoChaves);
  400.         // Destroi todos os valores da sessão relativos ao sistema de login
  401.         foreach ($_SESSION AS $chave => $valor) {
  402.             // Remove apenas valores cujas chaves comecem com o prefixo correto
  403.             if (substr($chave, 0, $tamanho) == $this->prefixoChaves) {
  404.                 unset($_SESSION[$chave]);
  405.             }
  406.         }
  407.         // Destrói asessão se ela estiver vazia
  408.         if (count($_SESSION) == 0) {
  409.             // Destruir a sessão
  410.             session_destroy();
  411.             // Remove o cookie da sessão se ele existir
  412.             if (isset($_COOKIE['PHPSESSID'])) {
  413.                 setcookie('PHPSESSID', false, (time() - 3600));
  414.                 unset($_COOKIE['PHPSESSID']);
  415.             }
  416.         }
  417.         // Remove o cookie com as informações do visitante
  418.         if ($this->cookie AND isset($_COOKIE[$this->prefixoChaves.'token'])) {
  419.             setcookie($this->prefixoChaves.'token', false, (time() - 3600), '/');
  420.             unset($_COOKIE[$this->prefixoChaves.'token']);
  421.             // Remove os Cookies Lembrados
  422.             $this->__limparDadosLembrados();
  423.         }
  424.         // Retorna SE não há um usuário logado
  425.         return !$this->UsuarioLogado();
  426.     }
  427. }
  428. /*********************************************************************************************************************************
  429. * End of User Settings
  430. *********************************************************************************************************************************/
  431. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement