How do I restrict access from a page to logged in users?

Asked

Viewed 1,959 times

0

I am login and registration system with 2 levels (1 corresponds to the common user and I want it to be redirected and level 2 is ADM, ADM have no problems). Be able to redirect to the site the common user, but still have the failure to access the site by URL.

I tried to solve by doing the Sessions, but I can still open the page by the URL without being logged in, the structure appears and everything, but it shows this error:

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /srv/disk4/2609189/www/grupodeestudos.atwebpages.com/site/index.php:1) in /srv/disk4/2609189/www/grupodeestudos.atwebpages.com/site/index.php on line 3

Code login.php

<?php
if($startaction == 1 && $acao == "logar"){
		//Dados
		$email=addslashes($_POST["email"]);
		$senha=addslashes(sha1($_POST["senha"]."hxtutors"));
		
		if(empty($email) || empty($senha)){
			$msg="Preencha todos os campos!";
		}else{
			if(!filter_var($email,FILTER_VALIDATE_EMAIL)){
				$msg="Digite seu e-mail corretamente!";
			}else{
				//Executa a busca pelo usuário
				$login=new Login;
				echo "<div class=\"flash\">";
				$login=$login->logar($email, $senha); 
				echo"</div>";
				
			}
		}
}
?>

Code login.class.php

<?php
session_start();
$con=mysqli_connect("xxxx","xxxx","xxxxx","xxxxx") or die(mysqli_connect_error());
// verifica conexão
if (mysqli_connect_errno())
  {
  echo "Falha ao conectar com MySQL: " . mysqli_connect_error();
  }
	class Login{
		public function logar($email, $senha){
			global $con;
			$buscar = mysqli_query($con,"SELECT * FROM usuarios WHERE email='$email' AND senha='$senha' LIMIT 1");
			if(mysqli_num_rows($buscar) == 1){
				$dados=mysqli_fetch_array($buscar);
				if($dados["status"] == 1){
					$_SESSION["email"]=$dados["email"];
					$_SESSION["senha"]=$dados["senha"];
					$_SESSION["nivel"]=$dados["nivel"];
					setcookie("logado",1);
					$log=1;
				}else{
					$flash="Aguarde a nossa aprovação!";
				}
			}
				if(isset($log)){
					$flash="Você foi logado com sucesso";
					$_SESSION['emailSession'] = $email;
					$_SESSION['senhaSession'] = $senha;
					$_SESSION['nivelSession'] = $nivel;
				}else{
					if(empty($flash)){
					$flash="Ops! Digite seu e-mail e sua senha corretamente!";
					}
				}
				echo $flash;
		}
	
	}

Page code to be restricted to logged in users:

<?php
    ob_start(); 
	session_start();
	
	if(!isset($_SESSION['emailSession']) AND !isset($_SESSION['senhaSession']) AND !isset($_SESSION['nivelSession'])){
		
		header("Location: http://grupodeestudos.atwebpages.com");
		
		exit;
		}
	require_once("admin/conexao/conecta.php");
	require("admin/functions/limita-texto.php");
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Grupo de Estudos 2018</title>
<link rel="stylesheet" type="text/css" href="css/reset.css" media="all">
<link rel="stylesheet" type="text/css" href="css/estilo.css" media="all">
</head>

<body>
<div id="cadastrar"><a href="../index.php?acao=logout" title="Fazer logout!">Logout &raquo;</a></div>

	<div class="divcenter">
    
    
    	<ul class="boxposts">
        
<?php

if(empty($_GET['pg'])){}
else{ 
$pg =$_GET['pg'];
if(!is_numeric($pg)){
	
	echo '<script language= "JavaScript">
					location.href="index.php";
		</script>';
}

}


if(isset($pg)){ $pg = $_GET['pg'];}else{ $pg = 1;}

$quantidade = 3;
$inicio = ($pg*$quantidade) - $quantidade;


	$sql = "SELECT * from tb_postagens WHERE exibir='Sim' ORDER BY id DESC LIMIT $inicio, $quantidade";
	try{
		$resultado = $conexao->prepare($sql);
		$resultado->execute();
		$contar = $resultado->rowCount();
		
		if($contar > 0 ){
			while($exibe = $resultado->fetch(PDO::FETCH_OBJ)){
?>        
        	<li>            	
                <span class="thumb">
                	<img src="upload/postagens/<?php echo $exibe->imagem;?>" alt="<?php echo $exibe->titulo;?>" title="<?php echo $exibe->titulo;?>" width="166" height="166">
                </span>                
                <span class="content">
                	<h1><?php echo $exibe->titulo;?></h1>
                    <p><?php echo limitarTexto($exibe->descricao, $limite=380)?></p> 
                    <div class="footer_post">
                    	<a href="post.php?id=<?php echo $exibe->id;?>">Leia o artigo completo</a>
                        <span class="datapost">Data de Publicação: <strong><?php echo $exibe->data;?></strong></span>                        
                    </div><!-- footer post -->                    
                </span>                
            </li>  
<?php
}//while
	}else{
		echo '<li>Não existe post cadastrados no sistema</li>';
	}
				
	}catch(PDOException $erro){ echo $erro;}
?>            
           
                  
        </ul>
        
        
        
        


<!-- inicio botoes -->

<style>
/* paginacao */

.paginas{width:100%;padding:10px 0;text-align:center;background:#fff;height:auto;margin:10px auto;}
.paginas a{width:auto;padding:4px 10px;background:#eee;color:#333;margin:0px 2.5px;text-decoration:none;font-family:tahoma, "Trebuchet Ms", arial;font-size:13px; }
.paginas a:hover{text-decoration:none;background:#00BA8B; color:#fff;}

<?php
	if(isset($_GET['pg'])){
		$num_pg = $_GET['pg'];	
	}else{$num_pg = 1;}
?>

.paginas a.ativo<?php echo $num_pg;?>{background:#00BA8B; color:#fff;}

#cadastrar{
	border-bottom-left-radius:8px;
	border-bottom-right-radius:15px;
	-webkit-border-bottom-left-radius:8px;
	-webkit-border-bottom-right-radius:15px;
	-moz-border-radius-bottomleft:8px;
	-moz-border-radius-bottomright:15px;
	height:40px;
	width:120px;
	background:#f1f1f1;
	text-align:center;
	position:absolute;
	right:0;
	top:0;
	z-index:2;
}

#cadastrar a{
	padding-top:5px;
	display:block;
	color:#999;
	font:400 18px Oswald;
}
#cadastrar:hover a{
	color:#fff;
}
#cadastrar:hover{
	background:#FF8C00;
	color:#fff;
}
</style>


<?php
	$sql = "SELECT * from tb_postagens";
	try{
			$result = $conexao->prepare($sql);			
			$result->execute();
			$totalRegistros = $result->rowCount();
		}catch(PDOException $e){
			echo $e;
		}
		
		if($totalRegistros <=$quantidade){}
		else{
			$paginas = ceil($totalRegistros/$quantidade);
			if($pg > $paginas){
				echo '<script language= "JavaScript">
					location.href="index.php";
					</script>';}
			$links = 5;	
			
			if(isset($i)){}
			else{$i = '1';}

?>

<div class="paginas">

	<a href="index.php?pg=1">Primeira Página</a>
    
    <?php
		if(isset($_GET['pg'])){
			$num_pg = $_GET['pg'];	
		}
		
		for($i = $pg-$links; $i <= $pg-1; $i++){
			if($i<=0){}
			else{ 
	?>
     
    <a href="index.php?pg=<?php echo $i;?>"  class="ativo<?php echo $i;?>"><?php echo $i;?></a>
     
         
<?php  }} ?>
    
    
    <a href="index.php?pg=<?php echo $pg;?>" class="ativo<?php echo $i;?>"><?php echo $pg;?></a>
    

<?php
	for($i = $pg+1; $i <= $pg+$links; $i++){
		if($i>$paginas){}
		else{
?>
			
	<a href="index.php?pg=<?php echo $i;?>" class="ativo<?php echo $i;?>"><?php echo $i;?></a>		
		
<?php
		}
	}
?>

<a href="index.php?pg=<?php echo $paginas;?>">Última página</a>		

    

</div><!-- paginas -->





<?php
		}
?>

<!-- fim botoes paginacao -->            
        
        
        
        
        
        
    	
    
    </div><!-- div center -->


</body>
</html>

Help me solve this goal: restrict the page to users logged in at level 1 so that there is no direct access through the URL.

3 answers

1

You must handle some specific situations (in addition to the error shown). It means that you must put on all pages that can only be accessed after authentication, a check code to check if the session exists and if the user type (level 1 or 2) can access that page. One simple way to do this is to create some functions in the login class (or another class specified for this purpose). It will be necessary:

  • a function to initialize the session (will be called all files that need access restriction)
  • one to check if the user is authenticated
  • one to check if the user is authorized (should be the most complex to do).

Then stay:

<?php
class Login{
    //......
    public function iniciarSessao(){
        //só chama session_start se ainda não tiver sido chamada (uma vez)
        if(!(session_status() === PHP_SESSION_ACTIVE)){
            session_start();
        }
    }

    /**
      @return boolean
    */
    public function estaLogado(){
        //aqui não importa o nivel do usuario. O importante é saber se 
        // o usuário está autenticado
        if(isset($_SESSION['email']) && isset($_SESSION['nivel'])){
            return true;
        }
        return false;
    }

    /**
       Verifica se o usuario autenticado pode acessar determinada pagina
       @param string $pagina nome do arquivo (a partir da url acessado)
                     por exemplo: http://www.dominio.com/compras.php onde 
                     $pagina = 'compras' sem a extensão
    */
    public function estaAutorizado($pagina, $nivel){
        //os indices equivalem a nivel 1 e nivel 2
        $paginas = [
            '1' => ['paginaA', 'paginaB', 'paginaC'],
            '2' => ['paginaC', 'paginaD', 'paginaE']
        ];


        if($nivel == 1){
            if(in_array($pagina, $paginas['1'])){
                return true;
            }
            return false;
        }else if($nivel == 2){
            if(in_array($pagina, $paginas['2'])){
                return true;
            }
            return false;
        }
        return false;
    }

    /**
       Essa função chama todas as outras (fica mais facil de colocar 
       em varios arquivos). Então ela será chamada em todos os arquivos
    */
    public function autenticadoAutorizado($pagina){
        $this->iniciarSessao();

        //se não estiver logado encerra o script
        if(!$this->estaLogado()){
            echo 'Não autorizado';
            exit;
        }

        //se não estiver autorizado a acessar a pagina encerra o script
        if(!$this->estaAutorizado($pagina, $_SESSION['nivel'])){
            echo 'Não autorizado';
            exit;
        }

        //se não entrar em nenhum dos ifs é por que o usuario está
        //autenticado e autorizado. Você pode futuramente usar 
        // ACL (lista de controle de acesso) que permite um controle
        //mais refinado
    }
}

And on the pages to be restricted (in each one) call the function autenticadoAutorizado(). Example:

<?php
    //chame autenticadoAutorizado() na primeira linha de cada arquivo
    //a ser restringido (dentro da tag do php, claro)
    //será necessario fazer o require da classe login.php (
    //certifique-se de que ao ser instanciada, nada é impresso 
    //pelo contrutor, acho que no seu caso nada é impresso)
    require_once 'Login.php';//coloque o caminho certo
    $login = new Login();    
    //identifica o nome do arquivo atual e sem a extensão (.php)
    $pagina = basename(__FILE__, '.php');
    $login->autenticadoAutorizado($pagina);  

    ob_start(); 
    //não chame mais session start aqui
    //session_start();

    if(!isset($_SESSION['emailSession']) AND !isset($_SESSION['senhaSession']) AND !isset($_SESSION['nivelSession'])){

        header("Location: http://grupodeestudos.atwebpages.com");

        exit;
        }
    require_once("admin/conexao/conecta.php");
    require("admin/functions/limita-texto.php");
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Grupo de Estudos 2018</title>
<link rel="stylesheet" type="text/css" href="css/reset.css" media="all">
<link rel="stylesheet" type="text/css" href="css/estilo.css" media="all">
</head>
<!-- .............. -->

That should solve.

Recommended reading:

  • I couldn’t... He from the error of na public Function estaAuthorized, $paginas e public Function estaAuthorized.

  • I forgot to grow in the question, but I did not do the syntactic check, I mean, there may be some syntactic error, like a missing comma and a dot. @Antonio

0

At the beginning PHP code of the file Grupo de Estudos 2018 place the following condition:

if($_SESSION['nivelSession'] != "2" || $_SESSION['nivelSession'] != 2){
    /* Redirecionar usuários que não sejam de nível 2 */
    /*    Como nível ou visitante que não se logou    */
    header("Location: http://grupodeestudos.atwebpages.com");
    exit();
}

As I did not see if the level and numeric or String put the two possibilities in IF

-1

1 - Header error:

Warning: session_start(): Cannot send session cache limiter - headers already 
sent (output started at 
/srv/disk4/2609189/www/grupodeestudos.atwebpages.com/site/index.php:1) in 
/srv/disk4/2609189/www/grupodeestudos.atwebpages.com/site/index.php on line 3

This error is usually returned if the site header has already been sent to the browser. This may be part of a code HTML or even the characters of GOOD (UTF-8 with BOM). Note that the error itself already explains that the header was sent in the same file, in the line 1 and is trying to send again on row 3 (session_start()); How do you use PHP, recommend this project to remove characters from GOOD: PHP based UTF8 byte order mark Cleaner.

2 - Restrict access to the page:

Quite simple: Create a condition based on the variable that stores the level of access of the logged-in user:

if( isset($_SESSION['nivel']) && $_SESSION['nivel'] == 1 )
{
   // código para usuários com nível 1
} else
if( isset($_SESSION['nivel']) && $_SESSION['nivel'] == 2 )
{
   // código para usuários com nível 2
} else
{
   // código para outros usuários
}

Note: A good practice is to store only what is really needed in your session. Never store the user password in the session.

Tip: Create a class with access to all user data based on their ID. It is a concept called DAO (Data access Object). Logo vc need to store only the user ID in the session and make the method call where you need the user data (Email, login, etc):

if($dados["status"] == 1){
    $_SESSION["id"]=$dados["id"];
}else{
// ...
  • Notepad++ has option to save as UTF-8 NO GOOD

Browser other questions tagged

You are not signed in. Login or sign up in order to post.