Ir ao conteúdo

PHP Sessions diferentes para cada nível de acesso


Ir à solução Resolvido por joseph_dev,

Posts recomendados

Postado

Olá pessoal!
Sou iniciante na linguagem. Estou criando um CRUD para o serviço, onde terei 3 niveis de acessos.

NÍVEIS:

1 - Administrador (Cadastra e exclui e edita as informações)

2 - Colaborador (Apenas cadastras informações)

3 - Usuario (Apenas lê as informações)

 

Adicionei um script onde ao logar, o sistema redireciona conforme o nível:

 

Parte do codigo que redireciona:

// O usuário está logado
        $_SESSION['logado']       = true;
        $_SESSION['nome_usuario'] = $fetch_usuario['user_name'];
        $_SESSION['usuario']      = $fetch_usuario['user'];
        $_SESSION['user_id']      = $fetch_usuario['user_id'];
        $_SESSION['nivel']      = $fetch_usuario['nivel'];
          if($_SESSION['nivel'] == "1"){
                header("Location: administrador.php");
            }elseif($_SESSION['nivel'] == "2"){
                header("Location: colaborador.php");
                }elseif($_SESSION['nivel'] == "3"){
                header("Location: usuario.php");
            }

 

 

 

 

VERIFICA_LOGIN.php

<?php
// Verifica se estamos conectados ao BD
if ( ! isset( $conexao_pdo ) || ! is_object( $conexao_pdo ) ) {
    exit('Erro na conexão com o banco de dados.');
}

// Une $_SESSION e $POST para verificação
if ( isset( $_POST ) && ! empty( $_POST ) ) {
    $dados_usuario = $_POST;
} else {
    $dados_usuario = $_SESSION;
}

// Verifica se os campos de usuário e senha existem
// E se não estão em branco
if ( 
    isset ( $dados_usuario['usuario'] ) && 
    isset ( $dados_usuario['senha'] )   &&
  ! empty ( $dados_usuario['usuario'] ) &&
  ! empty ( $dados_usuario['senha'] ) 
) {
    // Faz a consulta do nome de usuário na base de dados
    $pdo_checa_user = $conexao_pdo->prepare('SELECT * FROM usuarios WHERE user = ? LIMIT 1');
    $verifica_pdo = $pdo_checa_user->execute( array( $dados_usuario['usuario'] ) );
    
    // Verifica se a consulta foi realizada com sucesso
    if ( ! $verifica_pdo ) {
        $erro = $pdo_checa_user->errorInfo();
        exit( $erro[2] );
    }
      // Busca os dados da linha encontrada
    $fetch_usuario = $pdo_checa_user->fetch();
   // Verifica se a senha do usuário está correta
    if ( crypt( $dados_usuario['senha'], $fetch_usuario['user_password'] ) === $fetch_usuario['user_password'] ) {
        // O usuário está logado
        $_SESSION['logado']       = true;
        $_SESSION['nome_usuario'] = $fetch_usuario['user_name'];
        $_SESSION['usuario']      = $fetch_usuario['user'];
        $_SESSION['user_id']      = $fetch_usuario['user_id'];
        $_SESSION['nivel']      = $fetch_usuario['nivel'];
          if($_SESSION['nivel'] == "1"){
                header("Location: administrador.php");
            }elseif($_SESSION['nivel'] == "2"){
                header("Location: colaborador.php");
                }elseif($_SESSION['nivel'] == "3"){
                header("Location: usuario.php");
            }     

    } else {
        // Continua deslogado
        $_SESSION['logado']     = false;
        // Preenche o erro para o usuário
        $_SESSION['login_erro'] = 'Usuário ou senha inválidos';
    }
}
?>

 

O problema é que quando eu logo como por exemplo como nível 3 (usuario.php), se eu apagar o usuario.php apos a barra e colocar administrador.php ou colaborador.php, o sistema aceita. 

Haveria uma maneira de barrar isto onde o usuário somente teria acesso na pagina respectiva ao seu nível de acesso?

  • Solução
Postado

Seu site tem um controlador que gerencia as rotas? Se não tem, o mais simples é você verificar o nível do usuário em cada uma das 3 páginas do seu site.

Ex na página administrador.php:

if($_SESSION['nivel'] != "1"){
  exit('Você não tem permissão para acessar essa página.');
}

 

Tem outras formas mais elegantes de fazer isso, mas se tratando apenas de um projeto de CRUD, acredito que didático, já resolve a situação.

  • Moderador
Postado

@Marcelocjbh  Talvez esse post possa te ajudar a clarear as ideias de implementação:

 

A parte que te interessa é essa do código:

 

<?php
session_start();
setcookie("ck_authorized", "true", 0, "/");

/*testa se a sessão tem valor.
  Refere-se a linha lá no arquivo de login onde
  é inserido o login na sessão. */
if(!isset($_SESSION["login"])):
    header("location: index.php");
else:
    $login = $_SESSION["login"];
endif;    
?>

Ele é o responsável pela verificação se está logado no sistema. Você pode alterar, para ele verificar o nível também e redirecionar para o lugar certo.

Postado
21 horas atrás, joseph_dev disse:

Seu site tem um controlador que gerencia as rotas? Se não tem, o mais simples é você verificar o nível do usuário em cada uma das 3 páginas do seu site.

Ex na página administrador.php:



if($_SESSION['nivel'] != "1"){
  exit('Você não tem permissão para acessar essa página.');
}

 

Tem outras formas mais elegantes de fazer isso, mas se tratando apenas de um projeto de CRUD, acredito que didático, já resolve a situação.

Coloquei aqui conforme sua orientação e deu certo.
Adicionei isto nos cabeçalhos de cada pagina, informando o nível que necessito. Foi perfeito.
Muito obrigado pela orientação!

 

 

-----------------------------------------------------------

21 horas atrás, DiF disse:

@Marcelocjbh  Talvez esse post possa te ajudar a clarear as ideias de implementação:

 

A parte que te interessa é essa do código:

 



<?php
session_start();
setcookie("ck_authorized", "true", 0, "/");

/*testa se a sessão tem valor.
  Refere-se a linha lá no arquivo de login onde
  é inserido o login na sessão. */
if(!isset($_SESSION["login"])):
    header("location: index.php");
else:
    $login = $_SESSION["login"];
endif;    
?>

Ele é o responsável pela verificação se está logado no sistema. Você pode alterar, para ele verificar o nível também e redirecionar para o lugar certo.

 

Vou realizar as devidas mudanças conforme você me orientou. Muito obrigado por compartilhar com a gente.

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...