Há softwares que autenticam usuário através de tabelas e métodos próprios e outros autenticam através de mecanismos oferecidos pelos bancos de dados. Neste post, irei descrever como a autenticação de usuários da sua aplicação pode ser realizada via usuários do Windows. Isto significa que podem ser os próprios usuários de um domínio (DNS - Domain Name System) da sua empresa.
Antes do código fonte da autenticação propriamente dita, é interessante conhecer outras funções relacionadas. A primeira é a função que captura o nickname do usuário logado atualmente. Para utilizá-la, acesse a área de "Local External Functions" da sua janela ou objeto PowerBuilder e insira o código abaixo:
Function ulong GetUserNameW(ref string lpBuffer, ref ulong nSize) Library "advapi32.dll"
|
Perceba que estamos utilizando bibliotecas fornecidas pelo próprio sistema operacional.
Após isto, basta inserir o código abaixo em uma função ou evento do seu objeto para poder recuperar o nickname em questão:
String is_nome_usuario
ulong ll_size // Captura o nome do usuário da sessão atual do windows ll_size = 256 is_nome_usuario = Space(ll_size + 1) GetUserNameW(ref is_nome_usuario, ref ll_size) |
Abaixo, apresento mais duas funções úteis. Uma para recuperar o ID do processo atual e outra para recuperar o nome da estação (computador) utilizado:
Function ulong GetCurrentProcessId() Library "kernel32.DLL"
Function ulong GetComputerNameW(ref string lpBuffer, ref ulong nSize) Library "kernel32.DLL" |
E aqui o código da função:
String is_nome_computador
ulong ii_process_id ulong ll_size // Captura o ID do processo atual da aplicação ii_process_id = GetCurrentProcessId() // Captura o nome da estação de trabalho ll_size = 256 is_nome_computador = Space(ll_size + 1) GetComputerNameW(is_nome_computador, ll_size) |
Agora, segue a declaração da função de autenticação citada anteriormente:
Function boolean LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, ulong dwLogonType, ulong dwLogonProvider, ref ulong phToken) Library "advapi32.dll" Alias For "LogonUserA;Ansi"
Function boolean CloseHandle(ulong hObject) Library "kernel32.dll" |
E, finalmente, o código fonte para autenticação do usuário:
Boolean lb_resultado
String ls_dominio String ls_windows_usuario String ls_windows_senha ULong lul_token Constant ULong LOGON32_LOGON_NETWORK = 3 Constant ULong LOGON32_PROVIDER_DEFAULT = 0 // Captura de variáveis ls_dominio = "DEFINA O DOMÍNIO (SE HOUVER)" ls_windows_usuario = "DEFINA O USUÁRIO" ls_windows_senha = "DEFINA A SENHA" // Autentica o usuário lb_resultado = LogonUserA(ls_windows_usuario, ls_dominio, ls_windows_senha, & LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, lul_token ) // Verifica se autenticou com sucesso IF NOT lb_resultado THEN CloseHandle(lul_token) Messagebox("Não autenticado", "O login ou a senha informados estão incorretos.",stopsign! ) RETURN TRUE END IF RETURN FALSE |
Caso deseje conhecer a API dos comandos do sistema operacional utilizados nos exemplos acima, seguem os links: