Validaçao de login e senha com vetor

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Edu15
Usuário Nível 1
Usuário Nível 1
Mensagens: 5
Registrado em: 18 Dez 2012 08:08
Localização: Santo Andre - SP

Validaçao de login e senha com vetor

Mensagem por Edu15 »

Olá, estou começando a trabalhar com clipper agora e não tenho muita exeperiência com programação , gostaria de saber como eu posso criar uma tela de login e senha no clipper , mas usando um vetor pois eu preciso buscar de um banco de dados onde serão cadastrados vários usuários e senhas, porem tem que validar cada usuário com sua respectiva senha,eu criei um código, mas está dando uma mensagem de vetor esgotado, por favor se alguém puder dar uma ajuda eu agradeço demais, eu já pesquisei em vários sites mas não achei nada relacionado a isso. Desde já agradeço.
Segue o meu código para verificação de onde estou errando.

Código: Selecionar todos

CLEAR SCREEN
SET DATE BRITISH
SET CENTURY ON
SET CONFIRM ON
SET COLOR TO N/R
@ 0,0 CLEAR TO 30,79
@ 0,0 TO 30,79 DOUBLE
BORDA = CHR(201) + CHR(205) + CHR(187) + CHR(186) +;
CHR(188) + CHR(205) + CHR(200) + CHR(186) + CHR(176)

SELECT 1
USE USUARIO
INDEX ON LOGIN TO INDIC3
SET INDEX TO INDIC3
USE USUARIO INDEX INDIC3

SELECT 1
SET ORDER TO 1
DO WHILE .T.
cFIM = SPACE(1)
@ 4,4 SAY DATE()
@ 4,65 SAY TIME()
@ 4,30 SAY CDOW(DATE())
@ 5,30 SAY " TELA DE LOGIN "
DECLARE cLOGIN[2],cSENHA[2]
I = 0
 ACCEPT "LOGIN : " TO cLOGIN[I] 
READ
FOR I = 0 TO 2
LOCATE FOR LOGIN == cLOGIN[I]
IF FOUND()
    ACCEPT "SENHA : " TO cSENHA[I] 
	READ
	LOCATE FOR SENHA == cSENHA[I]
	IF FOUND()
	    DO MENU
ELSE
    @ 15,10 SAY " INVALIDO "
	INKEY(0)
	@ 15,10 SAY "            "
    @ 20,10 SAY " DESEJA SAIR ? " GET cFIM PICT "@!" VALID (cFIM $ "SN")
    READ
    SEEK cFIM	
    IF cFIM = "N"
       LOOP
    ELSE
       EXIT
    ENDIF
	ENDIF
	ENDIF
	NEXT
ENDDO
CLOSE DATABASE
CLEAR
RETURN
Editado pela última vez por Pablo César em 18 Dez 2012 10:25, em um total de 1 vez.
Razão: Mensagem editada para colocar a tag [ code ]<br>Veja como utilizar esta tag: http://www.pctoledo.com.br/forum/faq.php?mode=bbcode#f2r1
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Validaçao de login e senha com vetor

Mensagem por Jairo Maia »

Olá Edu,

Seja Bem Vindo ao Fórum.

Sem testar seu código, já posso adiantar que este erro que você está tendo está sendo provocado por este trecho:
I = 0
ACCEPT "LOGIN : " TO cLOGIN
READ
FOR I = 0 TO 2

Você está declarando duas variáveis array (embora colocou cLOGIN, deveria ser aLOGIN, pois são array), mas deixando uma série de coisas que breve você aprenderá, apenas vou me ater a explicar a causa do erro:

Quando você usa um Array, o primeiro elemento é o elemento 1, e o número máximo de elementos num array UNIDIMENSIONAL (seu caso) é de 4096 elementos. Assim, altere seu código da seguinte forma:
I = 1
ACCEPT "LOGIN : " TO cLOGIN
READ
FOR I = 1 TO 2

Nota: Como disse, não testei seu código, mas o erro cessará. Teste e veja o que ocoorre e nos informe.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
lugab
Colaborador
Colaborador
Mensagens: 843
Registrado em: 19 Mai 2009 15:58

Validaçao de login e senha com vetor

Mensagem por lugab »

Isso mesmo , Jairo.

E faltou também inicializar o campo csenha[n], antes de usar

FOR i = 1 TO 2
cLOGIN=space(n)
cSeNHA=space(n)
NEXT i
lugab
Edu15
Usuário Nível 1
Usuário Nível 1
Mensagens: 5
Registrado em: 18 Dez 2012 08:08
Localização: Santo Andre - SP

Validaçao de login e senha com vetor

Mensagem por Edu15 »

Bom, meus amigos Jairo e Lugab, primeiramente muito obrigado pelas dicas, eu mudei o nome dos arrays para aLOGIN e aSENHA e fiz o que me sugeriram, porém acontece o seguinte:

Se eu inicializo os arrays aLOGIN=SPACE(10) ele me dá uma mensagem = tipo diferent <na locate>.
Se eu não inicializo me dá a mensagem = variavel indefinida <na locate> aLOGIN.

E por favor me tirem uma duvida, o código em si está coerente, é mais ou menos assim que se faz uma tela de login?

Desde já agradeço.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Validaçao de login e senha com vetor

Mensagem por Jairo Maia »

Olá Edu,
Edu15 escreveu:E por favor me tirem uma duvida, o código em si está coerente, é mais ou menos assim que se faz uma tela de login?
Na minha opinião, você pode melhorar a tela de login, inclusive sem a necessidade de usar vetores. Temos por hábito apenas responder as dúvidas, afinal o objetivo do fórum é auxiliar, e não programar.

Mas para que possamos lhe dar uma idéia, nos passe o tamanho dos campos usuario e senha. Da minha parte vou tentar assim que puder lhe passar uma idéia, inclusive com criptografia do campo senha, e usando alguns recursos disponíveis na seção downloads deste fórum.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Edu15
Usuário Nível 1
Usuário Nível 1
Mensagens: 5
Registrado em: 18 Dez 2012 08:08
Localização: Santo Andre - SP

Validaçao de login e senha com vetor

Mensagem por Edu15 »

Obrigado Jairo, segue o tamanho dos campos.

Login = Space(10) e Senha = Space(10), vou cadastrar 5 usuários e 5 senhas.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Validaçao de login e senha com vetor

Mensagem por Maligno »

Já que está iniciando na programação, uma dica importante: não é usual o armazenamento de senhas. Isso só se faz quando a senha em questão precisa ser informada pelo seu programa para log-in em um serviço. Exemplo: o log-in do servidor de correio através do seu programa de correio.

Até por uma questão de segurança, o que normalmente se armazena é apenas um hash (MD5 é o mais utilizado nesse caso) da combinação nome_de_login e senha. Quando usuário logar, o MD5 é recalculado com os dados digitados e comparado ao MD5 já armazenado. Se o usuário perder a senha, outro usuário, mais privilegiado, libera o recadastramento de nova senha.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Validaçao de login e senha com vetor

Mensagem por Pablo César »

Seja bem vindo Edu a nossa comunidade !

Já que você pediu duas vezes opinião sobre o seu código, eu tenho para aconselhar mais sobre o método que você deve empregar. É importante que você mantenha uma programação com mais ordem e padronização que certamente irá ajudar-lhe ao longos dos anos, seja para você mais tarde rever os seus códigos como outros poderem entender-los com maior facilidade. Começa com a indentação dos laços de repetição (Do While, For.., Do Case, If..), sobre os nomes das variáveis que possam saber com a nomenclatura se elas são do tipo (numérico, caracter, lógico, data, memo, CONSTANTES, vetores, etc.), como já disse o nosso amigo Jairo. Depois ter em mente que apartir do Clipper 5, surgiu a característica de funções, retorno, parâmetros, isto é, passou a ser mais Function do que módulo prg. O que eu quero dizer, é que quanto você mais consiga definir e desmembrar cada necessidade, cada função, cada tipo de processamento... melhor. Deixe o conceito de fazer tudo num PRG só. Faça mais funções. Elas irão ajudar a diminuir o seu código, deixar mais enxuto e de processamento mais rápido também. Outra coisa, deixe sempre o seu programa de forma amigável com o usuário. Não faça perguntas ao usuário em demasia ou repetitivo, deixe o seu programa inteligente. Essa questão deseja sair ? Na minha opinião não deveria fazer. Deixe no rodapé da tela, dito que pressionando ESC sai do programa.

Não entendi o que você quer com esse seu código. Se você quer cadastrar ou validar. Pois bem, como já disse, tá ai, faça uma função que apenas valide e outra para cadastrar. Se para cadastrar, você precisa validar a pessoa que irá fazer a inclusão do usuário com nome e senha, então chame uma função que apenas obtenha essas informações (nome e senha) e depois valide. Uma vez sabendo se a pessoa tem direitos administrativos para inclusão de novos usuários, chame outra vez a função que irá obter o novo nome e a nova senha. Logo verifique se já não existe, dando uma mensagem ou saindo da inclusão.

Se você tem sempre mais do que um usuário a cadastrar, utilize o TBrowse. Imagine uma tela com colunas: nome e senha (claro que oculta, com asteriscos). Fica mais ágil e com maior visibilidade.

Eu estimulo você a refazer o seu código, visando o desdobramento de funções. Mas se decidir deixar como está, eu tenho algumas observações a fazer:

1. A abertura de arquivo USUARIO, isto é, senhas. Linhas 11 a 18. Deixe assim:

Código: Selecionar todos

SELECT 1
USE USUARIO
If !File("INDIC3.NTX")
   INDEX ON LOGIN TO INDIC3
Endif
SET INDEX TO INDIC3
// USE USUARIO INDEX INDIC3
// SELECT 1
// SET ORDER TO 1
Se o seus sistema não for rodar em rede, até pode ficar assim, Mais seria conveniente que você faça a abertura de forma compartilhada (uso do Shared New) e o tratamento de bloquear registro quando é gravado. Você estava sempre criando o arquivo de índice, o que é desnecessário se você mantém ele aberto e atualizado.

2. Sobre os SAYs e DECLARE dos vetores dentro de um laço de repetição (neste caso dentro do Do While), na minha opinião, estão desnecessários. Lembre, "laço de repetição" irá repetir N vezes o que poderia ter sido feito apenas uma vez, o que ocuparia mais lixo de memória, mais interrupções de vídeo. Para mim totalmente desnecessário.

3. Você tem um DO MENU, dentro desse do while. Se a questão era apresentar uma janelinha para validar e cadastrar um ou mais usuários, você a exibe, valida e grava e depois retornar ao menu. A utilização dos recursos de funções é fundamental para que o seu código não vire uma linguiça.

4. Sobre gravar as senhas, evidentemente que é necessário. Para evitar que espertinhos possam descobrir senhas editando o seu arquivo USUARIO.DBF então seria melhor encriptar as senhas e até mesmo o nome do usuário. Aqui no fórum tem exemplo de encriptação, veja este do Sr. Toledo: https://pctoledo.org/forum/fileba ... t=s&page=1 ou pode utiliza a função MD5 que o Maligno mencionou.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Validaçao de login e senha com vetor

Mensagem por Jairo Maia »

Olá Edu,

Além do que os colegas já disseram, vou fazer uma pequena contribuição para que você possa continuar seus estudos sobre a tela de login.

Para você ver o funcionamnto, sugiro você descarregar o anexo em uma pasta vazia, colocar sua função MENU() neste exemplo e compilar. Neste exemplo você verá que estou gerando um arquivo .DBF com apenas um usuário e senha, a saber:

Login = USUARIO1
Senha = 1234

Veja que a senha está criptografada, estude o exemplo para você ver o funcionamento.

Nota: Não coloquei um exemplo para você cadastrar novo Usuário e senha. Tente ajustar sua função de cadastro de senhas, levando em conta que ao salvar a senha, você precisa primeiro Encriptar usando a função ENCRIPTA(), que está no exemplo, e muito importante, não use Trim ou AllTrim no campo de senha, pois se você fizer isso, a decriptação ficará incorreta. Mantenha o campo com os 10 digitos.

Legal é você tentar entender e fazer essa adaptação, mas se tiver dificuldade, coloque o código da sua função de cadastro dos Usuários e Senhas, que fica mais facil fazer sugestões.

Espero que lhe ajude.
Anexos
TelaLog.zip
(2.9 KiB) Baixado 984 vezes
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Edu15
Usuário Nível 1
Usuário Nível 1
Mensagens: 5
Registrado em: 18 Dez 2012 08:08
Localização: Santo Andre - SP

Validaçao de login e senha com vetor

Mensagem por Edu15 »

Olá pessoal, voltei, estive todo esse tempo ocupado com outros serviços que me delegaram aqui na empresa, mas não deixei de estudar o danado do clipper, voltei para agradecer a todos que com suas dicas e conselhos me ajudaram demais no meu aprendizado, coisas que nunca iria encontrar em apostila nenhuma, muito obrigado mesmo, pois preciso aprender o clipper de qualquer jeito para poder garantir o meu emprego, gostaria de agradecer em especial ao amigo Jairo que com seu exemplo me ajudou a ver muitas coisas que pareciam muito complicadas, aprendi muito com seu exemplo e consegui empregá-lo em muitos outros casos no meu programa.
Até mais, pois logo precisarei de mais ajuda. Valeu!
Responder