Autenticação de usuários em PHP usando

sessões e MySQL
Esse artigo é um passo-a-passo da criação de um
sistema de autenticação de usuários usando banco de dados MySQL
e, principalmente, as poderosas sessões do PP! Mostro também
como trabal"ar com sen"as em M#$ e permissões para os usuários!
%tra&és desse artigo, espero 'ue &oc( consiga tirar
todas suas d)&idas sobre como de&e ser desen&ol&ido um sistema
de autenticação! Esse artigo mostra a principal base, o 'ual &oc(
poderá *acilmente adaptar +s suas necessidades!
%s sen"as serão criptogra*adas em "as" M#$, aumentando
o n,&el de segurança!
-ou usar como e.emplo um sistema de not,cias,
onde as not,cias serão &is,&eis apenas para usuários registrados!
/suários registrados também poderão en&iar no&as not,cias!
01picos2
• 34 5 0abelas no MySQL
• 36 5 7one.ão com o banco de dados
• 38 5 7riando o *ormulário e script
de Login
• 39 5 -eri*icando se usuário está
logado no sistema
• 3$ 5 : script de not,cias
• 3; 5 Sistema em *uncionamento
01.
Tabelas no MySQL
Primeiramente &amos criar as tabelas no MySQL
do nosso sistema de not,cias! %s tabelas se c"amarão autnoticias
e autusuarios, re*erentes +s <ot,cias e /suários respecti&amente!
!"di#o SQL das tabelas$
: campo postar da tabela autusuarios
registra a permissão do usuário, se ele poderá postar =&alor S>
ou não =&alor <> no&as not,cias!
%gora, &amos inserir alguns dados na tabela, para 'ue o e.emplo
do artigo *uncione! %'ui irei dar tudo pronto, mas no seu caso, em seu sistema,
&oc( de&erá criar uma seção para adicionar usuários, not,cias, etc? Mas isso
*ica *ora do escopo desse artigo!
%suários$
&ot'cias$
Perceba as sen"as criptogradas em M()! Para isso, use
a *unção md5("senha_aqui") e então sal&e o
&alor gerado no banco de dados, no caso, as sen"as são senha123 e teste
respecti&amente! Eu usei o c1digo abai.o para saber o M#$ para sal&ar no banco
de dados2
@Ap"p
ec"o md$=Bsen"a468C>D
ec"o B@brEFD
ec"o md$=BtesteF>D
AE
-eGa também 'ue a "ora na tabela de not,cias está
apenas em um &alor numérico! Para isso, usei a *unção time()
do PP! Para &oc( saber 'ual é essa data e "ora, use a *unção
date()! Hsso será mostrado adiante!
0*.
!one+ão com o banco de dados
-amos agora criar o ar'ui&o comum.,-,
onde e.istirá a cone.ão de banco de dados, usado em todas as páginas!
@Ap"p
II 7onecta-se com o MySQL
mys'lJconnect=Blocal"ostF,
BrootF,
BrootF>D
II Seleciona banco de dados
mys'lJselectJdb=BnoticiasF>D
AE
0..
!riando o /ormulário e scri,t de Lo#in
Página com o *ormulário onde o usuário digitará
o login e sen"a2
%gora &amos criar a página lo#in0ai.,-,, o 'ual recebe
os dados do *ormulário login!"tml e e*etua o login do usuário!
@Ap"p
II 7one.ão com o banco de dados
re'uire Kcomum!p"pKD
II Hnicia sessões
sessionJstart=>D
II Lecupera o login
Mlogin N isset=MJP:S0OKloginKP>
A addslas"es=trim=MJP:S0OKloginKP>>
2 Q%LSED
II Lecupera a sen"a, a criptogra*ando
em M#$
Msen"a N isset=MJP:S0OKsen"aKP>
A md$=trim=MJP:S0OKsen"aKP>>
2 Q%LSED
II /suário não *orneceu a sen"a ou
o login
i*=RMlogin
SS RMsen"a>
T
ec"o K-oc(
de&e digitar sua sen"a e loginRKD
e.itD
U
IVV
V E.ecuta a consulta no banco de dados!
V 7aso o n)mero de lin"as retornadas seGa 4 o login é &álido,
V caso 3, in&álido!
VI
MSQL N KSELE70
id, nome, login, sen"a, postar
QL:M autJusuarios
WELE login N KK!
Mlogin ! KKKD
MresultJid N Xmys'lJ'uery=MSQL>
or die=KErro no banco de dadosRK>D
Mtotal N
Xmys'lJnumJroYs=MresultJid>D
II 7aso o usuário ten"a digitado
um login &álido o n)mero de lin"as será 4!!
i*=Mtotal>
T
II :btém
os dados do usuário, para poder &eri*icar a sen"a e passar os
demais dados para a sessão
Mdados N
Xmys'lJ*etc"Jarray=MresultJid>D
II %gora
&eri*ica a sen"a
i*=Rstrcmp=Msen"a,
MdadosOKsen"aKP>>
T
II
0/#: :ZR %gora, passa os dados para a sessão e redireciona o usuário
MJSESSH:<OKidJusuarioKP N
MdadosOKidKPD
MJSESSH:<OKnomeJusuarioKP
N stripslas"es=MdadosOKnomeKP>D
MJSESSH:<OKpermissaoKP N
MdadosOKpostarKPD
"eader=KLocation2
inde.!p"pK>D
e.itD
U
II Sen"a
in&álida
else
T
ec"o KSen"a
in&álidaRKD
e.itD
U
U
II Login in&álido
else
T
ec"o K: login *ornecido
por &oc( é ine.istenteRKD
e.itD
U
AE
-eGa o uso da *unção strcm, na comparação
das sen"as! Ela está comparando as duas sen"as Gá criptogra*adas
em "as" M#$! Lembrando 'ue a *unção strcmp retorna [EL: caso 6
strings seGam iguais, por isso o uso do operador <:0 =R> na *rente
da mesma!
01.
2eri/icando se usuário está lo#ado no sistema
%gora, o script 0eri/ica.,-, 'ue &eri*ica a sessão do
usuário se ele está logado ou não! 7aso não esteGa logado, o redireciona para
a página de login!
@Ap"p
II Hnicia sessões
sessionJstart=>D
II -eri*ica se e.iste os dados da
sessão de login
i*=Risset=MJSESSH:<OKidJusuarioKP>
SS Risset=MJSESSH:<OKnomeJusuarioKP>>
T
II /suário
não logadoR Ledireciona para a página de login
"eader=KLocation2
login!"tmlK>D
e.itD
U
AE
Em todo script 'ue &oc( usar sessões, é obrigat1rio
'ue &oc( inicie as mesmas, c"amando a *unção sessionstart34
no começo dos scripts!
Para as páginas 'ue &oc( 'uiser dei.ar como restritas, simplesmente
inclua o ar'ui&o 0eri/ica.,-,!
0).
5 scri,t de not'cias
En*imR 7"egamos ao principal desse artigoR : script de not,cias,
onde tudo o 'ue *oi criado acima será usado! Esse ar'ui&o é o inde+.,-,!
@Ap"p
II -eri*icador de sessão
re'uire K&eri*ica!p"pKD
II 7one.ão com o banco de dados
re'uire Kcomum!p"pKD
II Hmprime mensagem de boas &indas
ec"o K\em--indoK
! MJSESSH:<OKnomeJusuarioKP
! KR@\LE]nKD
II -eri*ica e imprime 'uantidade
de not,cias no nome do usuário
MSQL N KSELE70
id
QL:M autJnoticias
WELE autorJid N K !
MJSESSH:<OKidJusuarioKPD
MresultJid N
mys'lJ'uery=MSQL>
or die=mys'lJerror=>>D
Mtotal N
mys'lJnumJroYs=MresultJid>D
i*=Mtotal>
T
ec"o Ká um total
de K ! Mtotal
! K not,cia=s>
de sua autoriaR]nKD
U
else
T
ec"o K<ão
"á nen"uma not,cia de sua autoriaR]nKD
U
IVV
V -eri*ica se usuário tem permissão para postar no&as not,cias!
V 7aso positi&o, imprime lin^ para postagem de not,cias
VI
i*=MJSESSH:<OKpermissaoKP
NN KSK>
T
ec"o F S @a "re*NKno&a!p"pKEPostar
no&a not,cia@IaE]nKD
U
II Hmprime lin^ de logout
ec"o K
S @a "re*NKsair!p"pKESair do Sistema@IaEKD
ec"o K@brE@brE]nKD
IVV
V Hmprime as not,cias
VI
MSQL N KSELE70
id, titulo, data
QL:M autJnoticias
:L#EL \_ data #ES7KD
MresultJid N
mys'lJ'uery=MSQL>
or die=mys'lJerror=>>D
Mtotal N
mys'lJnumJroYs=MresultJid>D
i*=Mtotal>
T
II %bre tabela
0ML
ec"o K@table
borderN4 cellpaddingN8 cellspacingN3E]nKD
ec"o K@trE@t"EHd@It"E@t"E0,tulo@It"E@t"E#ata@It"E@ItrE]nKD
II E*etua
o loop no banco de dados
Y"ile=Mdados
N mys'lJ*etc"Jarray=MresultJid>>
T
ec"o K@trE@tdEK
! MdadosOKidKP
! K@ItdE@tdE@a "re*NK&erJnoticia!p"pAidNK
! MdadosOKidKP
! K]KEK !
stripslas"es=MdadosOKtituloKP>
! K@IaE@ItdEKD
ec"o K@tdEK
! date=KdImI_
+]s 2i2sK, MdadosOKdataKP>
! K@ItdE@ItrE]nKD
U
II Qec"a
tabela
ec"o K@ItableE]nKD
U
else
T
ec"o K@\E<en"uma
not,cia cadastradaR@I\E]nKD
U
AE
: script de not,cias &eri*ica se usuário tem permissão
para postar no&as not,cias! 7aso sim, imprime o lin^ para a postagem!
: ar'ui&o para postar not,cias não será e.plicado a'ui,
pois *ica *ora do escopo desse artigo, mas, um e.emplo de como
de&e ser *eito2
@Ap"p
II -eri*icador de sessão
re'uire K&eri*ica!p"pKD
II -eri*ica se usuário tem permissão
para postar not,cia
i*=MJSESSH:<OKpermissaoKP
RNN KSK>
T
ec"o K-oc(
não tem permissão para postar not,ciasRKD
e.itD
U
II Se o script continuar a'ui, é
'ue o usuário tem permissão
II Então!! seu *ormulário de postagem abai.o
AE
` sempre recomendá&el 'ue &oc( colo'ue um lin^ para 'ue o usuário
encerre a sessão de login atual =sessões são encerradas com a *unção sessiondestroy34>,
caso ele não 'ueira mais permanecer na página! <o nosso e.emplo, a página é
a sair.,-,2
@Ap"p
II Hnicia sessões, para assim poder
destru,-las
sessionJstart=>D
sessionJdestroy=>D
"eader=KLocation2
login!"tmlK>D
AE
06.
Sistema em /uncionamento
%gora é "ora de testar tudoR Primeiro, logue-se com o login KeinsteinK
e sen"a Ksen"a468K! Esse usuário tem permissão para postar no&as not,cias
e tem 6 not,cias postadas!
7li'ue em KSair do SistemaK e logue-se com
o login KadminK e sen"a KtesteK! : usuário não tem permissão
para escrita e tem apenas uma not,cia postada =por e.emplo, como ele não tem
permissão para escrita, então de&e ter sido um administrador postado a not,cia
com o nome desse usuário>!
:bs2 caso a &ersão do seu PP seGa anterior + 9!4!3, use
a &ariá&el 7HTTPS8SS95&2A:S no lugar da superglobal 7S8SS95&!