quarta-feira, 9 de janeiro de 2013

Autenticação Windows em uma aplicação PowerBuilder

Quando falamos em autenticar usuários de uma aplicação, estamos tratando de aspectos de segurança de dados. Existem diversas formas de se realizar autenticações, porém é necessário ter cautela na escolha de qual modo é mais adequado ao seu sistema.

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 lpBufferref ulong nSizeLibrary "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:

Um comentário: