How to restrict one page access to logged in users?

0

I am a login system and register with 2 levels (1 corresponds to the common user and I want it to be redirected and level 2 is ADM, ADM has no problems). Can get the regular user to redirect to the site, but still has a failure to access the site through the URL.

I tried to resolve it by doing the sessions, but I can still open the page through the URL without being logged in, the structure appears and everything, but it has 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

Login.php code

<?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>";
				
			}
		}
}
?>

Login.class.php code

<?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 to Level 1 so that there is no direct URL access.

    
asked by anonymous 11.02.2018 / 08:47

3 answers

0

At the beginning PHP code of the Study Group 2018 field put 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 both possibilities in IF

    
11.02.2018 / 10:48
0

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

  • a function to initialize the session (will be called from all the files that need access restriction)
  • one to verify that 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 pages to be restricted (on each page) call the autenticadoAutorizado() function. 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>
<!-- .............. -->

This should resolve.

Recommended reading:

11.02.2018 / 16:27
-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 can be part of a HTML code or even the BOM (UTF-8 with BOM) characters. Notice that the error itself already explains that the header was sent in the same file, in line 1 and is trying to send again in line 3 ( session_start() ); Since you use PHP , I recommend this project to remove the BOM characters: PHP based UTF8 byte order mark cleaner.

2 - Restrict access to the page:

Very simple: Create a condition based on the variable that stores the access level 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 that you store only what you really need   in your session. Never store the user's password in the session.

Tip: Create a class with access to all user data based on his ID. It's a concept called DAO (Data access object) . So you need to store only the user ID in the session and call the method where you need the user data (Email, login, etc):

if($dados["status"] == 1){
    $_SESSION["id"]=$dados["id"];
}else{
// ...
    
11.02.2018 / 11:34