Criando esquema de autenticação personalizada com DBMS_CRYPTO



Criar uma autenticação personalizada no Oracle Apex é realmente simples. Neste exemplo, além de criar o esquema de autenticação personalizada, vamos utilizar o pacote DBMS_CRYPTO para criptografar os dados na tabela, tornando assim mais seguro.

Lembre-se, para utilizar o pacote DBMS_CRYPTO, é necessário que o usuário de banco tenha permissão de executar o pacote "SYS.DBMS_CRYPTO". 

Para atribuir permissão, basta executar o comando abaixo:

GRANT EXECUTE ON DBMS_CRYPTO TO ESQUEMA;

Primeiramente, vamos criar uma tabela USUARIO:

create table USUARIO
(
  cd_usuario NUMBER not null,
  nm_usuario VARCHAR2(15),
  senha      VARCHAR2(4000),
  st_usuario VARCHAR2(1),
  constraint PK_USUARIO primary key (CD_USUARIO)
);

Agora vamos criar o pacote PACK_AUTENTICACAO:
CREATE OR REPLACE PACKAGE PACK_AUTENTICACAO IS

  FUNCTION AUTENTICAR(p_username IN VARCHAR2 
                       ,p_password IN VARCHAR2) RETURN BOOLEAN;

END PACK_AUTENTICACAO;
/
CREATE OR REPLACE PACKAGE BODY PACK_AUTENTICACAO IS
  
  FUNCTION OBFUSCAR(TEXT_IN IN VARCHAR2) RETURN VARCHAR2 IS
  BEGIN
    RETURN DBMS_CRYPTO.HASH(UTL_I18N.STRING_TO_RAW(TEXT_IN, 'AL32UTF8' ), 
                            4);                     
  END;  

  FUNCTION AUTENTICAR(P_USERNAME IN VARCHAR2 
                       , P_PASSWORD IN VARCHAR2) RETURN BOOLEAN IS 
    L_OBFUSCATED_PASSWORD USUARIO.SENHA%TYPE; 
    L_VALUE               NUMBER; 
  BEGIN 
    l_obfuscated_password := OBFUSCAR(text_in => p_password); 
    BEGIN 
      SELECT 1 
        INTO l_value 
        FROM USUARIO 
       WHERE upper(USUARIO.NM_USUARIO) = upper(p_username) 
         AND USUARIO.SENHA = l_obfuscated_password 
         AND USUARIO.ST_USUARIO = 'A'; 
    EXCEPTION 
      WHEN OTHERS THEN 
        l_value := 0; 
    END; 
    RETURN  l_value = 1; 
  END AUTENTICAR; 
END PACK_AUTENTICACAO;

Note que os parâmetros de entradas do procedimento AUTENTICAR obrigatoriamente deve ter P_USERNAME e P_PASSWORD para compatibilidade com o Apex. Assim, não será preciso alterar a tela de login.

Agora, acesse "Authentication Schemes" em "Shared Components" e clique em "Create" para criar um novo esquema de autenticação.


Na tela a seguir, selecione a opção "Based on a pre-configured scheme from the gallery" e clique em "Next":

No campo "Name" informe um nome para a autenticação e selecione a opção "Custom" em "Scheme Type". No campo "Authentication Function Name" informe o procedimento criado acima "PACK_AUTENTICACAO.AUTENTICAR" e clique no botão "Apply Changes":


Agora vamos criar um novo usuário "ADMIN" com senha 12345:

INSERT INTO USUARIO (CD_USUARIO,
                     NM_USUARIO,
                     SENHA,
                     ST_USUARIO)
VALUES (1, 'ADMIN', DBMS_CRYPTO.HASH(UTL_I18N.STRING_TO_RAW('12345', 'AL32UTF8' ), 4), 'A');
COMMIT;

Basta fazer um select na tabela USUARIO:



Pronto, agora basta logar no seu aplicativo com o usuário ADMIN e senha 12345.

:D

Comentários