Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Galera estou com um problema. Estou desenvolvendo um módulo online,
mas precisaria criar uma espécie de níveis de login, mas seria um listbox,
que enviaria textos para o banco, depois eu verificaria qual a área o usuário
logado pode acessar, pois cada login acessará uma parte personalizada e o
administrador acessará todas.
Ex: Cadastro os usuarios, e no campo 'area' coloco area1, area2 ou area3.
quando ele fizer o login, preciso salvar em uma variavel o id do usuário que logou,
pra fazer um select e verificar qual área ele poderá acessar.
Eu tenho um sistema de login aqui que usava, que usa o session_register
Está assim:
while ($row = mysql_fetch_array($res_sel)) {
$id_login = $row[0];
$usr = $row[1];
$area = $row[2];
$autorizado = $row[3];
}
depois ele armazena os dados:
//INICIA A SESSÃO
session_start("acesso");
//REGISTRA AS VARIÁVEIS DE SESSÃO
session_register("id_login","usr","area");
Mas quando acesso o arquivo que ele redireciona, não consigo resgatar os dados:
Se eu faço isso:
$ID_LOGIN = $HTTP_SESSION_VARS["id_login"];
$USER = $HTTP_SESSION_VARS["usr"];
$AREA = $HTTP_SESSION_VARS["area"];
e depois dou um echo "$AREA";
ele não mostra nada e não da pra eu fazer as verificações...
acredito que é por eu estar usando o Wamp e ele tem alguma
configuração off.
andei dando uma lida, e parece que não se usa mais assim,
parece que por questão de segurança, então queria saber
se posso ligar alguma opção para isto funcionar, ou se tenho
que mudar o método. Porque a única coisa que pensei foi fazer assim:
Se usuario e senha estiver correto:
//REDIRECIONA PARA MENU.PHP
header("Location: menu.php?usuario=$id_login");
exit;
e no arquivo menu eu pego o id do usuario pelo get
mas pensei aqui, e se a pessoa quiser editar o id na url
e acessar o conteúdo de um adm por exemplo, não teria
segurança nenhuma.
Enfim, já prolonguei demais, o que acham que devo fazer?
me falaram que tem que usar $_SESSION, mas não sei como
grava valor e como resgatar na outra página depois...
desde já obrigado
Existe um problema nesta abordagem de sessão. Voce não vai conseguir controlar varios usuários no browser conectados em paralelo por abas. A sessão será unica para todos, e no momento que voce atribuir permissões a cada um deles logado na sessão, todos os usuários receberão o ultimo perfil atrelado, dando a permissão do ultimo usuário logado para todos os usuários logados no mesmo browser. As vezes um usuário que possui dois perfis, quer realizar o login no sistema com os dois perfis, utilizando as abas do browser.. o mesmo não obterá sucesso, pois como disse o sistema irá atrelar apenas uma sessão a todos os usuários que estiverem utilizando o browser e o usuário que tentar realizar este login terá apenas um unico usuário logado no sistema e não dois como ele pretendia.
Porém, existe varias técnicas que são utilizadas para resolver este problema. Eu desenvolvi uma classe que pode te ajudar, veja:
Sessao.class.php
<?php
class Sessao{
//armazena a chave de sessão gerada no momento do login, pelo comando mktime.
private $codigo;
//Recebe a solictação de destruição da sessão. Se o usuário solicitou a mesma recebe true. e o sistema ira destruir a sessão.
private $destruir;
//Método construtor, inicia a sessão para trabalharmos.
public function Sessao(){
//Starta a sessão.
session_start();
}
//valida a chave de acesso, verificando se realmente esta chave esta registrada no sistema.
public function validaChave($codigo){
//Se o sistema solicitou a destruição da sessão então iremos expira-la por segurança.
if ($this->destruir){
//solicita a expiração da sessão.
$this->expiraSession($codigo);
//senão o sistema esta permitindo o acesso
}else{
//vamos verificar a chave, se a mesma existir:
if ($codigo){
//se a sessão não estiver registrada vamos retornar false para expirar a sessão pois o usuario esta tentando acessar sem ter o acesso.
if(!isset($_SESSION[$codigo])){
//retorna false.
return false;
//senão o usuario esta com permissão e a chave existe, vamos liberar o acesso retornando true.
}else{
//obtemos a key inserindo os dados no parametro global.
$this->codigo = $codigo;
return true;
}
//senão o usuario não tem chave de acesso, vamos expira-lo. Pois sem chave sem acesso.
}else{
return false;
}
}
}
//esta função é responsavel por cadastrar a chave de acesso na sessão para logarmos os dados do usuario.
public function setCodigo($id){
//obtemos a key inserindo os dados no parametro global.
$this->codigo = $codigo;
//se o sistema solicitou a destruição do sistema, iremos expira-lo.
if ($this->destruir){
//expirando a sessão.
$this->expiraSession($codigo);
//senão o usuario esta com direito ao acesso.
}else{
//se a chave ainda não foi registrada
if(!isset($_SESSION[$codigo])){
//registraremos a chave criando um array que ira ser alimentado com os dados do usuario retornados pelo banco de dados
$_SESSION[$codigo] = array();
}
}
}
//Seta o valor na sessão, para utilizarmos futuramente.
public function setValor($nome,$valor){
//obtem o id da variavel global
$codigo = $this->codigo;
//se o sistemna solicitou a destruição do sistema, iremos expira-lo
if ($this->destruir){
//expirando o sistema
$this->expiraSession($codigo);
//senão o usuario tem o direito ao acesso, vamos verificar se os dados da sessão na foram criados, se ja forma não uremos setar mais o valor.
}elseif (!isset($_SESSION[$codigo][$nome])){
//sençao iremos setar os valores.
$_SESSION[$codigo][$nome] = $valor;
}
}
//obtendo os valores setados
public function getValor($nome,$codigo=null){
//se o id for null então vamos obter o id do sistema
if (empty($codigo)){
$codigo = $this->codigo;
}
//se o sistema solicitou a destruiução do sistema, iremos expira-lo
if ($this->destruir){
//expirando o sistema
$this->expiraSession($codigo);
//senão o usuario tem acesso a esta pate do sistema, vamos prosseguir.
}else{
//se o valor pedido existir, vamois retorna-lo
if(isset($_SESSION[$codigo][$nome])){
//retornando valores solicitados pelo usuario.
return $_SESSION[$codigo][$nome];
}
}
}
//expira a sessão (setor de segurança)
public function expiraSession($codigo){
//se a sessão não existir
if (empty($_SESSION[$codigo])){
//vamos destruir todas as sessões abertas neste browser por segurança expirando a sessão.
//normalmente o sistema entra nesta condição quando a chave de acesso esta inválida.
session_unset();
//retorna verdadeiro para alertar que a sessão expirou e não que o usuario não solicitou o fechamento da sessão.
return true;
//senão o usuario esta efetuando logof.
}else{
//vamos zerar os dados (chaves de acesso).
$_SESSION[$codigo] = null;
//destruir a sessão do usuario por segurança.
unset($_SESSION[$codigo]);
//retorna false para avisar que o usario solicitou a expiração da sessão.
return false;
}
//a destruição da sessão foi solicitada, vamos guardar esta informação por segurança.
$this->destruir = true;
}
}
?>
Esta classe controla o armazenamento de dados na sessão, validando e armazenando um código que é criado na chamada da classe para cada usuário logado no sistema, atribuindo todos os seus valores ao código criado. Com isso, podemos logar quantos usuários quisermos no sistema que cada um irá possuir uma chave de acesso diferente para utiliza-lo.
Para utilizar a classe devemos ter a seguinte chamada:
login.php
<?php
//Inclui a classe sessão para fazer o trabalho da validação.
@include Session.class.php;
//o restante do seu código
....source
//instancia a classe sessão criando assim o objeto para referenciar os metodos do mesmo.
$sessao = new Sessao();
//usa a função do mktime para gerar uma chave registro, "chave unica baseada na data e hora do sistema, nunca se repetira"
$codigo = "CHAVE".mktime();
//seta o código para a classe realizar as validações.
$sessao->setCodigo($codigo);
while ($row = mysql_fetch_array($res_sel)) {
//seta os valores baseados na chave registradora..
$sessao->setValor("ID_LOGIN" ,$row[0]);
$sessao->setValor("USR" ,$row[1]);
$sessao->setValor("AREA" ,$row[2]);
$sessao->setValor("AUTORIZADO" ,$row[3]);
}
?>
Com isso, o sistema fara assim cria uma chave por login e associa os dados do usuário logado a mesma, exemplo:
O José e a Maria logam no mesmo browser por abas separadas no sistema, com isso temos:
José:
chave: CHAVE131578783;
nome: José Carlos;
ID: 75;
AREA: 4;
Maria:
chave: CHAVE1397893;
nome: Maria Eduarda;
ID: 2;
AREA: 1;
Sendo assim, temos a seguinte sessão:
José:
$_SESSION['CHAVE131578783']['NOME'];
$_SESSION['CHAVE131578783']['ID'];
$_SESSION['CHAVE131578783']['AREA'];
Maria:
$_SESSION['CHAVE1397893']['NOME'];
$_SESSION['CHAVE1397893']['ID'];
$_SESSION['CHAVE1397893']['AREA'];
Então, se precisarmos destruir a sessão da maria, destruiriamos o vetor referente a chave dela que é CHAVE1397893.
O unico equivoco desta classe é que todas as paginas devem receber a chave do usuário para validar a permissão de acesso do mesmo. Esta informação pode ser inserida nos links dos forms, passando assim a chave para todas as paginas via GET para realizar a validação da mesma.
Espero ter ajudado.
Boa sorte ai. http://forum.imasters.com.br/public/style_emoticons/default/joia.gif
Aí na outra página você põe: