Hoje em dia é bastante comum querermos ou precisarmos restringir ou personalizar algumas seções do site.
Uma maneira de implementar isso é utilizando um objeto de Sessão ($_SESSION no caso do PHP) no lado do servidor e autenticar o usuário por meio de um formulário de login e senha.
E para isso é necessário:
1 -Criar a estrutura no banco de dados p/ armazenar o usuários;
2- Criar a interface de acesso e o controlador de autenticação
E nas páginas que vc quiser restringir basta fazer o seguinte :
1 - Criar um arquivo que verifica o estado da sessão e manda p/ a pagina de Login, se já não estiver logado.
2 - Incluir esse arquivo <include,require,require_once> no começo de cada arquivo restrito
O Exemplo :
De onde veio este exemplo existem clientes e funcionários.Ambos são pessoas.
Assim sendo temos a classe base Pessoa e as classes que estendem Pessoa que são Cliente e Funcionario. já detalhadas aqui
E por questões de segurança e regras do negócio ambos serão tratados como usuários, onde as views são separadas, mas acessam os mesmos objetos (assim as regras ficam organizadas, evitando códigos duplicados)
Vamos a estrutura do banco :
Observe que temos a tabela cliente e funcionario e usuario é uma view
![]() |
| Figura 1 - estrutura do banco |
// funcionario
CREATE TABLE IF NOT EXISTS `mydb`.`funcionario` (
`id` INT(11) NOT NULL AUTO_INCREMENT ,
`nome` VARCHAR(150) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NULL DEFAULT NULL ,
`funcao` VARCHAR(150) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NULL DEFAULT NULL ,
`cpf` VARCHAR(11) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NOT NULL ,
`data_admissao` DATE NOT NULL ,
`salario` DECIMAL(7,2) NOT NULL ,
`rg` VARCHAR(15) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NOT NULL ,
`carteira_trab` VARCHAR(15) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NULL DEFAULT NULL ,
`pis` VARCHAR(11) CHARACTER SET 'utf8' COLLATE 'utf8_bin' NOT NULL ,
`data_nascimento` DATE NOT NULL ,
`senha` VARCHAR(45) NULL DEFAULT NULL ,
`ativo` TINYINT(1) NOT NULL DEFAULT '1' ,
`admin` TINYINT(1) NULL DEFAULT '0' ,
`perfil_acesso` ENUM('Atendente','Gestor','Admin') NULL DEFAULT NULL ,
`login` VARCHAR(45) NULL DEFAULT NULL ,
`email` VARCHAR(120) NULL DEFAULT NULL ,
PRIMARY KEY (`id`) )
ENGINE = InnoDB
AUTO_INCREMENT = 4
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci
//view
CREATE OR REPLACE VIEW `usuario` AS
select `C`.`id` AS `id`,
`C`.`email` AS `login`, -- login do cliente é o email
`C`.`senha` AS `senha`,
'C' AS `tipo_usuario`, -- define C
`C`.`ativo` AS `ativo`,
'Cliente' AS `perfil_acesso`
from `mydb`.`cliente` `C`
union
select `F`.`id` AS `id`,
`F`.`login` AS `login`, -- funcionario possui um campo login
`F`.`senha` AS `senha`,
'F' AS `tipo_usuario`, -- define F
`F`.`ativo` AS `ativo`,
`F`.`perfil_acesso` AS `perfil_acesso` -- le o perfil
from `mydb`.`funcionario` `F`
Vamos a estrutura dos arquivos :
![]() |
| Figura 2 - Organização dos arquivos |
Vamos aos arquivos:
Models:
/app/model/Funcionario.php
<?
// @arquivo = /app/model/Funcionario.php
// MVC : model
// objeto : Funcionario
require_once($_SERVER['DOCUMENT_ROOT'] . '/app/model/Pessoa.php');
class Funcionario extends Pessoa{
var $funcao;
var $cpf;
var $dataAdmissao;
var $salario;
var $rg;
var $carteiraTrab;
var $pis;
var $dataNascimento;
var $senha;
var $ativo;
var $admin;
var $perfilAcesso;
var $login;
var $email;
public function Funcionario() {
}
public function getFuncao() {
return $this->funcao;
}
public function setFuncao($funcao) {
$this->funcao = $funcao;
}
public function getCpf() {
return $this->cpf;
}
public function setCpf($cpf) {
$this->cpf = $cpf;
}
public function getDataAdmissao() {
return $this->dataAdmissao;
}
public function setDataAdmissao($dataAdmissao) {
$this->dataAdmissao = $dataAdmissao;
}
public function getSalario() {
return $this->salario;
}
public function setSalario($salario) {
$this->salario = $salario;
}
public function getRg() {
return $this->rg;
}
public function setRg($rg) {
$this->rg = $rg;
}
public function getCarteiraTrab() {
return $this->carteiraTrab;
}
public function setCarteiraTrab($carteiraTrab) {
$this->carteiraTrab = $carteiraTrab;
}
public function getPis() {
return $this->pis;
}
public function setPis($pis) {
$this->pis = $pis;
}
public function getDataNascimento() {
return $this->dataNascimento;
}
public function setDataNascimento($dataNascimento) {
$this->dataNascimento = $dataNascimento;
}
public function getSenha() {
return $this->senha;
}
public function setSenha($senha) {
$this->senha = $senha;
}
public function getAtivo() {
return $this->ativo;
}
public function setAtivo($ativo) {
$this->ativo = $ativo;
}
public function getAdmin() {
return $this->admin;
}
public function setAdmin($admin) {
$this->admin = $admin;
}
public function getPerfilAcesso() {
return $this->perfilAcesso;
}
public function setPerfilAcesso($perfilAcesso) {
$this->perfilAcesso = $perfilAcesso;
}
public function getLogin() {
return $this->login;
}
public function setLogin($login) {
$this->login = $login;
}
public function getEmail() {
return $this->email;
}
public function setEmail($email) {
$this->email = $email;
}
}
?>
/app/model/Usuario.php
<?
// @arquivo = /app/model/Usuario.php
// MVC : model
// objeto : Usuario
// OBS : não existe uma tabela usuario no banco, e sim uma view que é uma junção
// das tabelas clientes e funcionarios
class Usuario {
var $id;
var $login;
var $senha;
var $tipoUsuario;
var $ativo;
var $perfilAcesso;
public function Usuario() {
$this->id=0;
// $this->admin=0;
}
public function getId() {
return $this->id;
}
public function setId($id) {
$this->id = $id;
}
public function getLogin() {
return $this->login;
}
public function setLogin($login) {
$this->login = $login;
}
public function getSenha() {
return $this->senha;
}
public function setSenha($senha) {
$this->senha = $senha;
}
public function getTipoUsuario() {
return $this->tipoUsuario;
}
public function setTipoUsuario($tipoUsuario) {
$this->tipoUsuario = $tipoUsuario;
}
public function getAtivo() {
return $this->ativo;
}
public function setAtivo($ativo) {
$this->ativo = $ativo;
}
public function getPerfilAcesso() {
return $this->perfilAcesso;
}
public function setPerfilAcesso($perfilAcesso) {
$this->perfilAcesso = $perfilAcesso;
}
}
?>
DAOs:
/app/dao/UsuarioDAO.php
<?
require_once($_SERVER['DOCUMENT_ROOT'] . '/lib/Conexao.php');
require_once($_SERVER['DOCUMENT_ROOT'] . '/app/model/Usuario.php');
class UsuarioDAO {
public function UsuarioDAO(){}
public function autenticar($login, $senha) {
$Usuario = new Usuario();
$conexao = new Conexao();
$conexao->conecta();
$sqlQuery = sprintf("Select id,login,senha,ativo,tipo_usuario,perfil_acesso from usuario where login='%s'
and senha='%s'",$login,$senha);
// die ($sqlQuery);
$rs = $conexao->executeQuery($sqlQuery);
if ($row=mysql_fetch_array($rs)) {
$Usuario->setId($row['id']);
$Usuario->setLogin($row['login']);
$Usuario->setAtivo($row['ativo']);
$Usuario->setTipoUsuario($row['tipo_usuario']);
$Usuario->setPerfilAcesso($row['perfil_acesso']);
}
$conexao->desconecta();
return $Usuario;
}
public function load(Usuario $user) {
$conexao = new Conexao();
$conexao->conecta();
$sqlQuery = "Select id,senha,tipo_usuario from usuario where id=".$user->getId();
$rs = $conexao->executeQuery($sqlQuery);
if ($row=mysql_fetch_array($rs)) {
$Usuario = new Usuario();
$Usuario->setId($row['id']);
$Usuario->setSenha($row['senha']);
$Usuario->setTipoUsuario($row['tipo_usuario']);
}
$conexao->desconecta();
return $Usuario;
}
public function atualizaSenhaCliente(Usuario $user, $novasenha) {
$conexao = new Conexao();
$conexao->conecta();
$sqlQueryUpdate = "UPDATE cliente
SET
`senha`='".$novasenha."'
where id=".$user->getId();
$rs = $conexao->executeUpdate($sqlQueryUpdate);
$conexao->desconecta();
}
public function localizaPorEmail($email) {
$conexao = new Conexao();
$conexao->conecta();
$sqlQuery = "Select id,senha,tipo_usuario from usuario where login='".$email."' ";
$rs = $conexao->executeQuery($sqlQuery);
$carregado=false;
if ($row=mysql_fetch_array($rs)) {
$Usuario = new Usuario();
$Usuario->setId($row['id']);
$Usuario->setSenha($row['senha']);
$Usuario->setTipoUsuario($row['tipo_usuario']);
$carregado=true;
}
$conexao->desconecta();
if ($carregado){
return $Usuario;
}
else {
return null;
}
}
public function localizaPorDoc($tipoDoc, $busca) {
$conexao = new Conexao();
$conexao->conecta();
$carregado=false;
$sqlQuery = "Select id,senha,tipo_usuario from usuario where $tipoDoc='".$busca."' ";
$rs = $conexao->executeQuery($sqlQuery);
if ($row=mysql_fetch_array($rs)) {
$Usuario = new Usuario();
$Usuario->setId($row['id']);
$Usuario->setSenha($row['senha']);
$Usuario->setTipoUsuario($row['tipo_usuario']);
$carregado=true;
}
$conexao->desconecta();
if ($carregado){
return $Usuario;
}
else {
return null;
}
}
}?>
Controllers:
/app/controller/Usuario/autentica.php
<?
// @arquivo = /app/view/Usuario/autentica.php - recebe as variaveis de login via post
session_start();
require_once($_SERVER['DOCUMENT_ROOT'] . '/app/model/Usuario.php');
require_once($_SERVER['DOCUMENT_ROOT'] . '/app/controller/UsuarioController.php');
$user = new Usuario();
$userC = new UsuarioController();
if (isset($_POST['data']['Usuario']['login'])) {
$login = $_POST['data']['Usuario']['login'];
}
if (isset($_POST['data']['Usuario']['senha'])) {
$senha = $_POST['data']['Usuario']['senha'];
}
$user = $userC->autenticar($login, $senha);
if ($user->getId() == 0) {
header("Location: /login.php");
}
if (($user->getId() != 0) && ($user->getTipoUsuario() == "C")) {
$_SESSION['user']['logado'] = true;
$_SESSION['user']['tipoUsuario'] = $user->getTipoUsuario();
$_SESSION['user']['login'] = $user->getLogin();
$_SESSION['user']['idUsuario'] = $user->getId();
$_SESSION['user']['perfilAcesso'] = $user->getPerfilAcesso();
$_SESSION['user']['view'] = "/cliente.php";
header("Location: /pages/cliente.php?section=usuario&action=home");
}
if (($user->getId() != 0) && ($user->getTipoUsuario() == "F")) {
$_SESSION['user']['logado'] = true;
$_SESSION['user']['tipoUsuario'] = $user->getTipoUsuario();
$_SESSION['user']['login'] = $user->getLogin();
$_SESSION['user']['idUsuario'] = $user->getId();
$_SESSION['user']['perfilAcesso'] = $user->getPerfilAcesso();
switch ($_SESSION['user']['perfilAcesso']) {
case "Admin":
$_SESSION['user']['view'] = "/pages/privado.php";
header("Location: ".$_SESSION['user']['view']);
break;
case "Gestor":
$_SESSION['user']['view'] = "/pages/privado.php";
header("Location: ".$_SESSION['user']['view']);
break;
case "Atendente":
// $_SESSION['user']['view'] = "/atendente.php";
$_SESSION['user']['view'] = "/pages/privado.php";
header("Location: ".$_SESSION['user']['view']);
break;
default : // se tiver erro no cadastro, ou não tiver essa info
header("Location: /login.php");
break;
}
}?>
/app/controller/UsuarioController.php <?
// @arquivo = /app/model/UsuarioController.php
// MVC : controller
// objeto : UsuarioController
require_once($_SERVER['DOCUMENT_ROOT'].'/lib/Conexao.php');
require_once($_SERVER['DOCUMENT_ROOT'].'/app/model/Usuario.php');
require_once($_SERVER['DOCUMENT_ROOT'].'/app/dao/UsuarioDAO.php');
class UsuarioController {
function autenticar($login,$senha){
$usuarioDAO = new UsuarioDAO();
$Usuario = $usuarioDAO->autenticar($login,$senha);
return $Usuario;
}
public function load(Usuario $user) {
$usuarioDAO = new UsuarioDAO();
$Usuario = $usuarioDAO->load($user);
return $Usuario;
}
// DEVE SER USADO APENAS P/ CLIENTES
public function atualizaSenha(Usuario $user, $novasenha){
$usuarioDAO = new UsuarioDAO();
$usuarioDAO->atualizaSenhaCliente($user, $novasenha);
}
public function localizaUsuario($email){
$usuarioDAO = new UsuarioDAO();
$Usuario = $usuarioDAO->localizaPorEmail($email);
return $Usuario;
}
public function localizaUsuarioPorDocumento($tipoDoc, $busca) {
$usuarioDAO = new UsuarioDAO();
$Usuario = $usuarioDAO->localizaPorDoc($tipoDoc, $busca);
return $Usuario;
}
}
?>
Views:
/login.php
<?
session_start();
if (isset($_GET['action']) && $_GET['action'] == 'logout') {
unset($_SESSION['user']['logado'], $_SESSION['user']['tipoUsuario'], $_SESSION['user']['login'], $_SESSION['user']['idUsuario'], $_SESSION['user']['perfilAcesso'], $_SESSION['user']['view']
);
}
?>
<fieldset>
<form action="/app/controller/Usuario/autentica.php" method="POST" id="formLogin" name="formLogin">
<label for="Login">Login:</label>
<input name="data[Usuario][login]" maxlength="30" type="text" id="login"/>
<label for="Senha">Senha:</label>
<input name="data[Usuario][senha]" maxlength="15" type="password" id="senha"/>
<div class="submit"><input type="submit" value="@Login"/></div>
</form>
</fieldset>
/lib/Conexao.php --descrita aqui
Agora vc pode optar por 2 alternativas
1 - Cria o arquivo trava.php p/ ser incluido em todas as paginas
<?
// arquivo /lib/trava.php
session_start();
if (!isset($_SESSION['user']['logado'] )) {
header("Location: /login.php?message=2");
}?>
e em todas paginas :
<? require_once($_SERVER['DOCUMENT_ROOT'] ."/lib/trava.php"); ?>2 - ou implementa o seu próprio framework a partir daqui :
/lib/Utils.php
<?
// @arquivo = /lib/Utils.php
// MVC : controller
// objeto :
// obs : as funções comuns ao projeto
function includeFile($file) {
try {
if (file_exists($file)) {
require_once $file;
} else {
//throw new Exception("Arquivo '$file' não encontrado");
throw new Exception("A operação deste modulo '$file' ainda não foi implementada.");
}
} catch (Exception $ex) {
echo $ex->getMessage();
}
}
function includeNewFile($file) {
try {
$fileX = $_SERVER['DOCUMENT_ROOT'].$file;
// die($fileX);
if (file_exists($fileX)) {
require_once $fileX;
} else {
//throw new Exception("Arquivo '$file' não encontrado");
throw new Exception("A operação deste modulo '$file' ainda não foi implementada.");
}
} catch (Exception $ex) {
echo $ex->getMessage();
}
}
?>
/pages/* ou views
opcoes.php
<?php
error_reporting('E_ALL');
if (!$_SESSION['user']["logado"]) {
header("Location: /login.php");
}
require_once($_SERVER['DOCUMENT_ROOT'] .'/lib/Utils.php');
if (isset($_GET['section'])){
$section= $_GET['section'];
switch($section){
case 'clientes':
$model='Cliente';
$controller='ClienteController';
break;
case 'servicos':
$model='Servico';
$controller='ServicoController';
break;
case 'tarefas':
$model='Tarefa';
$controller='TarefaController';
break;
case 'usuario':
$model='Usuario';
$controller='UsuarioController';
break;
case 'funcionarios':
$model='Funcionario';
$controller='FuncionarioController';
break;
case 'boletos':
$model='Boleto';
$controller='BoletoController';
break;
default:
$model='empty';
$controller='empty';
break;
}
includeNewFile("/app/controller/".$controller.".php");
includeNewFile("/app/model/".$model.".php");
}
$pageAction=''; // pagina de acao
if (isset($_GET['action'])){
$action= $_GET['action'];
switch($action){
/*
case 'index':
$pageAction='index.php';
break;
case 'add':
$pageAction='add.php';
break;
case 'edit':
$pageAction='edit.php';
break;
case 'remove':
$pageAction='remove.php';
break;
case 'view':
$pageAction='view.php';
break;
case 'login':
$pageAction='login.php';
break;
*/
default:
$pageAction=$action.'.php';
break;
}
}
?>
view.php
<?php
if (isset($_GET['section'])){
$section = $_GET['section'];
if ($section!=''){
try {
includeNewFile("/app/view/".$model."/".$pageAction);
}
catch (Exception $err){
echo $err->getMessage();
}
}
}
?>
/pages/privado.php essa é a página do funcionário que faz todos os includes
<?
session_start();
error_reporting('E_ALL');
if (!isset($_SESSION['user']['logado'] )) {
header("Location: /login.php?message=2");
}
// gestor, admin e atendente tem acesso a essa pagina
if (!isset($_SESSION['user']['perfilAcesso']) || $_SESSION['user']['perfilAcesso']=="Cliente" ) {
header("Location: /login.php?message=2");
}
require_once($_SERVER['DOCUMENT_ROOT'] ."/pages/opcoes.php");
?>
<!doctype html>
<?php require_once($_SERVER['DOCUMENT_ROOT'] ."/static_includes/inc_conditionals.php"); ?>
<head>
<?php
$pageName = "TITULO";
include $_SERVER['DOCUMENT_ROOT'] ."/static_includes/inc_head-meta.php";
?>
</head>
<body>
<div id="container" class="box_round_0 box_shadow_0">
<?php include $_SERVER['DOCUMENT_ROOT'] ."/static_includes/inc_header.php"; ?>
<div id="main" class="clearfix">
<div id="content">
<? require_once('view.php'); ?>
</div></div>
<?php include $_SERVER['DOCUMENT_ROOT'] ."/static_includes/inc_footer.php"; ?>
</div>
<?php include $_SERVER['DOCUMENT_ROOT'] ."/static_includes/inc_pos-scripts.php"; ?>
</body>
</html>
/pages/cliente.php essa é a página do cliente que faz todos os includes obs:esse arquivo não aparece na foto do projeto acima
<?
session_start();
error_reporting('E_ALL');
if (!isset($_SESSION['user']['logado'] )) {
header("Location: /login.php?message=2");
}
// gestor, admin e atendente tem acesso a essa pagina
if (!isset($_SESSION['user']['perfilAcesso']) || $_SESSION['user']['perfilAcesso']!="Cliente" ) {
header("Location: /login.php?message=2");
}
require_once($_SERVER['DOCUMENT_ROOT'] ."/pages/opcoes.php");
?>
<!doctype html>
<?php require_once($_SERVER['DOCUMENT_ROOT'] ."/static_includes/inc_conditionals.php"); ?>
<head>
<?php
$pageName = "TITULO";
include $_SERVER['DOCUMENT_ROOT'] ."/static_includes/inc_head-meta.php";
?></head>
<body>
<div id="container" class="box_round_0 box_shadow_0">
<?php include $_SERVER['DOCUMENT_ROOT'] ."/static_includes/inc_header.php"; ?>
<div id="main" class="clearfix">
<div id="content">
<? require_once('view.php'); ?>
</div>
</div>
<?php include $_SERVER['DOCUMENT_ROOT'] ."/static_includes/inc_footer.php"; ?>
</div>
<?php include $_SERVER['DOCUMENT_ROOT'] ."/static_includes/inc_pos-scripts.php"; ?>
</body>
</html>
e Pronto. As seções estão separadas.
Agora a base do site na url fica assim após o Login:
http://seudominio/pages/privado.php?section=clientes&action=index e o arquivo /static_includes/inc_header.php pode conter os links p/ as seções
/static_includes/inc_header.php
<?
if (isset($_SESSION['user']['logado'])) {
$userLogado = $_SESSION['user']['logado'];
} else {
$userLogado = false;
}
?>
<div>
<nav>
<ul class="main-menu">
<li><a href="/index.php" <?php if ($pageName == 'Home') echo 'class="current"'; ?>>Home</a></li>
<? if ($userLogado) { ?>
<li><a href="<? echo $_SESSION['user']['view']; ?>?section=boletos&action=index" <?php if ($_GET['section'] == 'boletos') echo 'class="current"'; ?>>Boletos</a></li>
<li><a href="<? echo $_SESSION['user']['view']; ?>?section=funcionarios&action=index"<?php if ($_GET['section'] == 'funcionarios') echo 'class="current"'; ?> >Funcionarios</a> </li>
<li><a href="<? echo $_SESSION['user']['view']; ?>?section=clientes&action=index"<?php if ($_GET['section'] == 'clientes') echo 'class="current"'; ?> >Clientes</a> </li>
<? } ?>
</ul>
</nav>


Um comentário:
Boa tarde, voce poderia passar o script completo dessa aplicação?
ta meio dificil fazer funcionar aqui, atraves desses posts picados.
desde ja agradeço
juninho_1703@hotmail.com
Postar um comentário