Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá a todos,
Estou com um problema no meu cadastro de usuário.
A parte de cadastrar está sendo realizada corretamente e meu login também, o meu problema está é que tenho que cadastrar em uma tela, depois entrar em outra para validar e acessar.
Gostaria que quando eu realizasse o cadastro já valida-se e entrasse direto, sem precisar ter que entrar na outra pagina e rodar o login.
Segue meu cadastro que está funcionando:
//--Insere Registro
if(isset($_POST['cadastrar'])){
@$usuario = trim(strip_tags($_POST['usuario']));
@$senha = trim(strip_tags($_POST['senha']));
@$nivel_acesso = trim(strip_tags($_POST['nivel_acesso']));
$insert = "INSERT INTO cad_usuario (usuario, senha, nivel_acesso)
VALUES (:usuario, :senha, :nivel_acesso)";
try{
$result = $conexao->prepare($insert);
$result->bindParam(':usuario', $usuario, PDO::PARAM_STR);
$result->bindParam(':senha', $senha, PDO::PARAM_STR);
$result->bindParam(':nivel_acesso', $nivel_acesso, PDO::PARAM_STR);
$result->execute();
$contar = $result->rowCount();
if($contar>0){
echo '<div class="alert alert-success">
<button type="button" class="close" data-dismiss="alert">×</button>
<strong>Sucesso!</strong> O Usuario foi Cadastrado!</div>';
$_SESSION['autenticado'] = true;
}else{
echo '<div class="alert alert-danger">
<button type="button" class="close" data-dismiss="alert">×</button>
<strong>Erro ao cadastrar!</strong> Não foi possível cadastrar o Usuario.</div>';
}}catch(PDOException $e){
echo $e;
}}
}
}
Segue meu validador do usuário cadastrado que está funcionando:
<?php
session_start();
include_once "connection/conecta.php";
$usuario = new Usuario();
try {
if($usuario->confere($_POST['usuario'],$_POST['senha'])) {
$_SESSION['autenticado'] = true;
$_SESSION['usuario'] = $_POST['usuario'];
header('location: principal.php');
} else {
$_SESSION['autenticado'] = false;
include_once "index.php";
exit("<div class='alert alert-danger col-sm-12'>Usuário ou senha incorretos. Verifique</div>");
} echo "Ocorreu um erro inesperado: ". $p->getMessage();
}
?>
Segue minha pagina principal aonde valida a **$_SESSION['autenticado'] = false; **
Mas só valida se passar na pagina index e passar pela validação a cima.
<?php
require_once("connection/conecta.php");
ob_start();
session_start();
if (@!$_SESSION['autenticado']){
include_once "index.php";
exit("<div class='alert alert-danger col-sm-12'>Para acessar o sistema você deve efetuar login</div>");
}
$logado = $_SESSION['usuario'];
$sql = "SELECT * from cad_usuario WHERE usuario = '$logado' and situacao = 'A'";
try{
$result = $conexao->prepare($sql);
$result->execute();
$contar = $result->rowCount();
if($contar =1){
$loop = $result->fetchAll();
foreach ($loop as $show){
$userLogado = $show['usuario'];
$senhaLogado = $show['senha'];
$nivelLogado = $show['nivel_acesso'];
}
}
}catch (PDOWException $erro){ echo $erro;}
?>>
2 minutos atrás, Motta disse:
Peço que se possível troque o bold pelo
code
, botão <>
Grato
Realizado a alteração.
Show , bem melhor não ?
Só não ajudo pois sou analfabeto em php .
>
1 minuto atrás, Motta disse:
Show , bem melhor não ?
Só não ajudo pois sou analfabeto em php .
Realmento ficou bem melhor, sou novo aqui.
Se você puder aprovar o conteúdo para que o pessoal da comunidade puder me ajudar.
Já está.
Sendo simplista, você não precisa passar pela primeira
validação, pois você já o cadastrou e não foi retornado
nenhum erro, então, agora, basta você obter e salvar o
usuário que foi inserido em uma **$_SESSION**, e assim,
fazer o redirecionamento para a página **Principal**, onde
você irá obter os dados cadastrados e etc...
Segue exemplo, abaixo:
**CÓDIGO [ CADASTRO ]**
<?php
session_start();
include_once "connection/conecta.php";
if(isset($_POST['cadastrar'])){
@$usuario= trim(strip_tags($_POST['usuario']));
@$senha= trim(strip_tags($_POST['senha']));
@$nivel_acesso = trim(strip_tags($_POST['nivel_acesso']));
$insert = "INSERT INTO cad_usuario (usuario, senha, nivel_acesso) VALUES (:usuario, :senha, :nivel_acesso)";
try{
$result = $conexao->prepare($insert);
$result->bindParam(':usuario',$usuario, PDO::PARAM_STR);
$result->bindParam(':senha',$senha, PDO::PARAM_STR);
$result->bindParam(':nivel_acesso', $nivel_acesso, PDO::PARAM_STR);
$result->execute();
$contar = $result->rowCount();
if($contar>0){
echo '<div class="alert alert-success">
<button type="button" class="close" data-dismiss="alert">×</button>
<strong>Sucesso!</strong> O Usuario foi Cadastrado!</div>';
$_SESSION['usuario'] = $usuario;
$_SESSION['autenticado'] = true;
header('Location: principal.php');
}else{
echo '<div class="alert alert-danger">
<button type="button" class="close" data-dismiss="alert">×</button>
<strong>Erro ao cadastrar!</strong> Não foi possível cadastrar o Usuario.</div>';
}
}catch(PDOException $e){
echo $e;
}
}
**CÓDIGO [ PRINCIPAL ]**
<?php
require_once("connection/conecta.php");
ob_start();
session_start();
if (@!$_SESSION['autenticado']) {
include_once "index.php";
exit("<div class='alert alert-danger col-sm-12'>Para acessar o sistema você deve efetuar login</div>");
}
$logado = $_SESSION['usuario'];
$sql = "SELECT * from cad_usuario WHERE usuario = '$logado' and situacao = 'A'";
try{
$result = $conexao->prepare($sql);
$result->execute();
$contar = $result->rowCount();
if($contar = 1){
$loop = $result->fetchAll();
foreach ($loop as $show){
// USAR SESSAO PARA PODER "TRANSITAR"
// OS DADOS RELEVANTES NO SISTEMA...
//
// A SENHA FOI REMOVIDA POR SEGURANÇA
//
// COMO JÁ TEMOS O USUARIO GUARDADO
// EM SESSAO, NÃO TEMOS MOTIVO PARA
// SETA-LO NOVAMENTE...
$_SESSION['nivel'] = $show['nivel_acesso'];
}
print_r($_SESSION);
}
}catch (PDOWException $erro){ echo $erro; }
?>
**RECOMENDAÇÕES:**
**1 - **Você poderia, no cadastro, fazer uma verificação
para ver se o usuário já está sendo utilizado;
**2 - **Armazenar o **ID **do usuário em uma **Sessão, **pois
pode ser de grande utilidade para você no futuro,
principalmente caso queira obter dados
relacionados a ele.Hora?? Para que tanta "moda"?!
Se a intenção é cadastrar e já logar, basta que ao completar o registro inicie os índices de session que forem cabíveis ao usuário logado, então redirecione para a página inicial por exemplo.
Uns detalhes:
Nisso aqui para começar
>
23 horas atrás, szLeonardo disse:
@$usuario = trim(strip_tags($_POST['usuario']));
Você tem um input name "usuario" blz não é?! Mas por causa do ofuscador @ que colocou alí, um malandro pode manipular o html removendo-o ou modificando-o, o PHP irá aceitar mesmo sendo inválido, ou seja a PDO vai inserir um valor nulo.
Outra coisa não confie na função strip_tags ela pode ser facilmente burlada, use um filter_var para cada valor pois isso sim é seguro.
Outra me parece que você deve ter um input que define o nível de acesso, isso não é seguro, algo assim só pode ser manipulado no back-end.
Veja um exemplo de otimização que fiz:
Spoiler
<?php
if (isset($_POST['cadastrar'])) {
$usuario = (isset($_POST['usuario']) ? trim($_POST['usuario']) : false);
$senha = (isset($_POST['senha']) ? trim($_POST['senha']) : false);
if (!$usuario) {
// Não recebeu $_POST['usuario'] ou o mesmo está vazio
} else if (!filter_var($usuario, FILTER_SANITIZE_STRING)) {
// Inseriu algum caractere que não é uma string válida, expl.: tentativa de XSS ou SQL INJECT
} else if (!$senha) {
// Não recebeu $_POST['senha'] ou o mesmo está vazio
}
// Não precisamos filtrar a senha pois vamos trabalhar com criptografia nela
else {
$salvar_usuario = htmlentities($usuario); // Previna erros de acentuação e codificação usando a função htmlentities
$salvar_senha = password_hash($senha, PASSWORD_DEFAULT); // Proteja seus usuários use criptografia nas senhas
$insert = "
INSERT INTO
cad_usuario (usuario, senha, nivel_acesso)
VALUES
(:usuario, :senha, :nivel_acesso)
";
try {
$result = $conexao->prepare($insert);
$result->bindParam(':usuario', $salvar_usuario, PDO::PARAM_STR);
$result->bindParam(':senha', $salvar_senha, PDO::PARAM_STR);
//$result->bindParam(':nivel_acesso', $nivel_acesso, PDO::PARAM_STR);
$result->bindParam(':nivel_acesso', '1', PDO::PARAM_STR);
$result->execute();
if ($result->rowCount()) {
echo ("<div class=\"alert alert-success\">"
. "<button type=\"button\" class=\"close\" data-dismiss=\"alert\">×</button>"
. "<span style=\"font-weight:bold\">Sucesso!</span> O Usuario foi Cadastrado!</div>");
/*
AQUI VOCÊ INICIA AS SESSÕES E REDIRECIONA O USUÁRIO
*/
$_SESSION['autenticado'] = true;
$_SESSION['usuario'] = $salvar_usuario;
$_SESSION['nivel_acesso'] = 1;
header('LOCATION: ./');
// Ou
/*
?>
<script>
setTimeout(function () {
window.location.reload();
// ou
//window.location.href = 'local para ser redirecionado';
}, 3000);
</script>
<?php
*/
} else {
echo ("<div class=\"alert alert-danger\">"
. "<button type=\"button\" class=\"close\" data-dismiss=\"alert\">×</button>"
. "<span style=\"font-weight:bold\">Erro ao cadastrar!</span>"
. "Não foi possível cadastrar o Usuario.</div>");
}
} catch (PDOException $e) {
//echo $e;
/*
* Registre um log de erros você não vai querer um espertalhão ter acesso ao código fonte caso algo der errado
* $e->getLine();
* $e->getMessage();
*/
}
}
}>
Em 24/04/2020 at 19:08, ShadowDLL disse:
Sendo simplista, você não precisa passar pela primeira
validação, pois você já o cadastrou e não foi retornado
nenhum erro, então, agora, basta você obter e salvar o
usuário que foi inserido em uma **$_SESSION**, e assim,
fazer o redirecionamento para a página **Principal**, onde
você irá obter os dados cadastrados e etc...
Segue exemplo, abaixo:
**CÓDIGO [ CADASTRO ]**
<?php
session_start();
include_once "connection/conecta.php";
if(isset($_POST['cadastrar'])){
@$usuario= trim(strip_tags($_POST['usuario']));
@$senha= trim(strip_tags($_POST['senha']));
@$nivel_acesso = trim(strip_tags($_POST['nivel_acesso']));
$insert = "INSERT INTO cad_usuario (usuario, senha, nivel_acesso) VALUES (:usuario, :senha, :nivel_acesso)";
try{
$result = $conexao->prepare($insert);
$result->bindParam(':usuario',$usuario, PDO::PARAM_STR);
$result->bindParam(':senha',$senha, PDO::PARAM_STR);
$result->bindParam(':nivel_acesso', $nivel_acesso, PDO::PARAM_STR);
$result->execute();
$contar = $result->rowCount();
if($contar>0){
echo '<div class="alert alert-success">
<button type="button" class="close" data-dismiss="alert">×</button>
<strong>Sucesso!</strong> O Usuario foi Cadastrado!</div>';
$_SESSION['usuario'] = $usuario;
$_SESSION['autenticado'] = true;
header('Location: principal.php');
}else{
echo '<div class="alert alert-danger">
<button type="button" class="close" data-dismiss="alert">×</button>
<strong>Erro ao cadastrar!</strong> Não foi possível cadastrar o Usuario.</div>';
}
}catch(PDOException $e){
echo $e;
}
}
**CÓDIGO [ PRINCIPAL ]**
<?php
require_once("connection/conecta.php");
ob_start();
session_start();
if (@!$_SESSION['autenticado']) {
include_once "index.php";
exit("<div class='alert alert-danger col-sm-12'>Para acessar o sistema você deve efetuar login</div>");
}
$logado = $_SESSION['usuario'];
$sql = "SELECT * from cad_usuario WHERE usuario = '$logado' and situacao = 'A'";
try{
$result = $conexao->prepare($sql);
$result->execute();
$contar = $result->rowCount();
if($contar = 1){
$loop = $result->fetchAll();
foreach ($loop as $show){
// USAR SESSAO PARA PODER "TRANSITAR"
// OS DADOS RELEVANTES NO SISTEMA...
//
// A SENHA FOI REMOVIDA POR SEGURANÇA
//
// COMO JÁ TEMOS O USUARIO GUARDADO
// EM SESSAO, NÃO TEMOS MOTIVO PARA
// SETA-LO NOVAMENTE...
$_SESSION['nivel'] = $show['nivel_acesso'];
}
print_r($_SESSION);
}
}catch (PDOWException $erro){ echo $erro; }
?>
**RECOMENDAÇÕES:**
**1 - **Você poderia, no cadastro, fazer uma verificação
para ver se o usuário já está sendo utilizado;
**2 - **Armazenar o **ID **do usuário em uma **Sessão, **pois
pode ser de grande utilidade para você no futuro,
principalmente caso queira obter dados
relacionados a ele.
Muito obrigado, realizei o teste e deu certo.
Estava me batendo nisso.>
Em 25/04/2020 at 15:29, Omar~ disse:
Hora?? Para que tanta "moda"?!
Se a intenção é cadastrar e já logar, basta que ao completar o registro inicie os índices de session que forem cabíveis ao usuário logado, então redirecione para a página inicial por exemplo.
Uns detalhes:
Nisso aqui para começar
Você tem um input name "usuario" blz não é?! Mas por causa do ofuscador @ que colocou alí, um malandro pode manipular o html removendo-o ou modificando-o, o PHP irá aceitar mesmo sendo inválido, ou seja a PDO vai inserir um valor nulo.
Outra coisa não confie na função strip_tags ela pode ser facilmente burlada, use um filter_var para cada valor pois isso sim é seguro.
Outra me parece que você deve ter um input que define o nível de acesso, isso não é seguro, algo assim só pode ser manipulado no back-end.
Veja um exemplo de otimização que fiz:
Mostrar conteúdo oculto
<?php
if (isset($_POST['cadastrar'])) {
$usuario = (isset($_POST['usuario']) ? trim($_POST['usuario']) : false);
$senha = (isset($_POST['senha']) ? trim($_POST['senha']) : false);
if (!$usuario) {
// Não recebeu $_POST['usuario'] ou o mesmo está vazio
} else if (!filter_var($usuario, FILTER_SANITIZE_STRING)) {
// Inseriu algum caractere que não é uma string válida, expl.: tentativa de XSS ou SQL INJECT
} else if (!$senha) {
// Não recebeu $_POST['senha'] ou o mesmo está vazio
}
// Não precisamos filtrar a senha pois vamos trabalhar com criptografia nela
else {
$salvar_usuario = htmlentities($usuario); // Previna erros de acentuação e codificação usando a função htmlentities
$salvar_senha = password_hash($senha, PASSWORD_DEFAULT); // Proteja seus usuários use criptografia nas senhas
$insert = "
INSERT INTO
cad_usuario (usuario, senha, nivel_acesso)
VALUES
(:usuario, :senha, :nivel_acesso)
";
try {
$result = $conexao->prepare($insert);
$result->bindParam(':usuario', $salvar_usuario, PDO::PARAM_STR);
$result->bindParam(':senha', $salvar_senha, PDO::PARAM_STR);
//$result->bindParam(':nivel_acesso', $nivel_acesso, PDO::PARAM_STR);
$result->bindParam(':nivel_acesso', '1', PDO::PARAM_STR);
$result->execute();
if ($result->rowCount()) {
echo ("<div class=\"alert alert-success\">"
. "<button type=\"button\" class=\"close\" data-dismiss=\"alert\">×</button>"
. "<span style=\"font-weight:bold\">Sucesso!</span> O Usuario foi Cadastrado!</div>");
/*
AQUI VOCÊ INICIA AS SESSÕES E REDIRECIONA O USUÁRIO
*/
$_SESSION['autenticado'] = true;
$_SESSION['usuario'] = $salvar_usuario;
$_SESSION['nivel_acesso'] = 1;
header('LOCATION: ./');
// Ou
/*
?>
<script>
setTimeout(function () {
window.location.reload();
// ou
//window.location.href = 'local para ser redirecionado';
}, 3000);
</script>
<?php
*/
} else {
echo ("<div class=\"alert alert-danger\">"
. "<button type=\"button\" class=\"close\" data-dismiss=\"alert\">×</button>"
. "<span style=\"font-weight:bold\">Erro ao cadastrar!</span>"
. "Não foi possível cadastrar o Usuario.</div>");
}
} catch (PDOException $e) {
//echo $e;
/*
* Registre um log de erros você não vai querer um espertalhão ter acesso ao código fonte caso algo der errado
* $e->getLine();
* $e->getMessage();
*/
}
}
}
Cara deu certo seu exemplo, muito obrigado, teria como me enviar um exemplo de autenticação de login com a descriptografia?>
7 horas atrás, szLeonardo disse:
Cara deu certo seu exemplo, muito obrigado, teria como me enviar um exemplo de autenticação de login com a descriptografia?
É muito simples, eu seu formulário de login, você deve ter um campo input para nome de login e senha (eu sempre uso só e-mail e senha), enfim não importa. A questão é ter um campo ao qual poderemos localizar os dados do usuário no banco, pois nesse caso a senha não serve para localizar e sim para autenticar.
Digamos então que o usuário digitou seu e-mail e sua senha, basta fazer uma busca no banco de dados por aquele e-mail, se existir podemos armazenar a senha do usuário em uma $var e fazer a autenticação:
// Aqui estamos no contexto que o e-mail do usuário que está tentando logar existe
if (password_verify($senha_digitada_pelo_usuario, $senha_criptograda_no_banco)) {
// Podemos logar tanto o e-mail existe quanto a senha é do usuário
} else {
// a senha não confere de acordo com o SALT (Ou seja aqui ele errou a senha)
}
Só para completar o coluna na tabela que vai armazenar a senha deve ser VARCHAR de pelo menos 255 caracteres, ou pode se um TEXT.
Peço que se possível troque o bold pelo
code
, botão <>
Grato