

# Criação de funções personalizadas para verificar senhas
<a name="Appendix.Oracle.CommonDBATasks.CustomPassword"></a>

Você pode criar uma função de verificação de senha personalizada das seguintes maneiras:
+ Para usar a lógica de verificação padrão e armazenar a função no esquema `SYS`, utilize o procedimento `create_verify_function`. 
+ Para usar a lógica de verificação padrão ou evitar armazenar a função no esquema `SYS`, utilize o procedimento `create_passthrough_verify_fcn`. 

# O procedimento create\$1verify\$1function
<a name="Appendix.Oracle.CommonDBATasks.CustomPassword.Standard"></a>

Você pode criar uma função personalizada para verificar senhas usando o procedimento do Amazon RDS `rdsadmin.rdsadmin_password_verify.create_verify_function`. O procedimento `create_verify_function` é compatível com todas as versões do RDS para Oracle.

O procedimento `create_verify_function` tem os seguintes parâmetros. 


****  

| Nome do parâmetro | Tipo de dados | Padrão | Obrigatório | Descrição | 
| --- | --- | --- | --- | --- | 
|  `p_verify_function_name`  |  varchar2  |  —  |  Sim  |  O nome da sua função personalizada. Essa função é criada por você no esquema SYS. Você atribui essa função a perfis de usuário.   | 
|  `p_min_length`  |  número  |  8  |  Não  |  O número mínimo de caracteres necessários.  | 
|  `p_max_length`  |  número  |  256  |  Não  |  O número máximo de caracteres permitidos.  | 
|  `p_min_letters`  |  número  |  1  |  Não  |  O número mínimo de letras necessárias.  | 
|  `p_min_uppercase`  |  número  |  0  |  Não  |  O número mínimo de letras maiúsculas necessárias.  | 
|  `p_min_lowercase`  |  número  |  0  |  Não  |  O número mínimo de letras minúsculas necessárias.  | 
|  `p_min_digits`  |  número  |  1  |  Não  |  O número mínimo de dígitos necessários.  | 
|  `p_min_special`  |  número  |  0  |  Não  |  O número mínimo de caracteres especiais necessários.  | 
|  `p_min_different_chars`  |  número  |  3  |  Não  |  O número mínimo de caracteres diferentes exigido entre a senha antiga e nova.  | 
|  `p_disallow_username`  |  booliano  |  true  |  Não  |  Defina como `true` para não permitir o nome de usuário na senha.  | 
|  `p_disallow_reverse`  |  booliano  |  true  |  Não  |  Defina como `true` para não permitir o inverso do nome de usuário na senha.  | 
|  `p_disallow_db_name`  |  booliano  |  true  |  Não  |  Defina como `true` para não permitir o nome do banco de dados ou do servidor na senha.  | 
|  `p_disallow_simple_strings`  |  booliano  |  true  |  Não  |  Defina como `true` para não permitir strings simples como senha.  | 
|  `p_disallow_whitespace`  |  booliano  |  false  |  Não  |  Defina como `true` para não permitir caracteres de espaço em branco na senha.  | 
|  `p_disallow_at_sign`  |  booliano  |  false  |  Não  |  Defina como `true` para não permitir o caractere @ na senha.  | 

Você pode criar várias funções de verificação de senha.

Existem restrições quanto ao nome da sua função personalizada. Sua função personalizada não pode ter o mesmo nome que um objeto de sistema existente. O nome pode ter no máximo 30 caracteres. Além disso, o nome deve incluir uma das seguintes strings: `PASSWORD`, `VERIFY`, `COMPLEXITY`, `ENFORCE` ou `STRENGTH`. 

O exemplo a seguir cria uma função chamada `CUSTOM_PASSWORD_FUNCTION`. A função requer que uma senha tenha pelo menos 12 caracteres, 2 caracteres em maiúsculas, 1 dígito e 1 caractere especial e que a senha não permita o caractere @. 

```
begin
    rdsadmin.rdsadmin_password_verify.create_verify_function(
        p_verify_function_name => 'CUSTOM_PASSWORD_FUNCTION', 
        p_min_length           => 12, 
        p_min_uppercase        => 2, 
        p_min_digits           => 1, 
        p_min_special          => 1,
        p_disallow_at_sign     => true);
end;
/
```

Para ver o texto da sua função de verificação, consulte `DBA_SOURCE`. O exemplo a seguir obtém o texto de uma função de senha personalizada chamada `CUSTOM_PASSWORD_FUNCTION`. 

```
COL TEXT FORMAT a150

  SELECT TEXT 
    FROM DBA_SOURCE 
   WHERE OWNER = 'SYS' 
     AND NAME = 'CUSTOM_PASSWORD_FUNCTION' 
ORDER BY LINE;
```

Para associar sua função de verificação a um perfil de usuário, use `ALTER PROFILE`. O exemplo a seguir associa uma função de verificação PL/SQL denominada `CUSTOM_PASSWORD_FUNCTION` ao perfil de usuário `DEFAULT`. `PASSWORD_VERIFY_FUNCTION` é o nome do recurso do perfil da Oracle. 

```
ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION CUSTOM_PASSWORD_FUNCTION;
```

Para ver quais perfis de usuários estão associados a quais funções de verificação, consulte `DBA_PROFILES`. O exemplo a seguir obtém os perfis associados à função de verificação personalizada chamada `CUSTOM_PASSWORD_FUNCTION`. 

```
SELECT * FROM DBA_PROFILES WHERE RESOURCE_NAME = 'PASSWORD_VERIFY_FUNCTION' AND LIMIT = 'CUSTOM_PASSWORD_FUNCTION';


PROFILE                    RESOURCE_NAME                     RESOURCE  LIMIT
-------------------------  --------------------------------  --------  ------------------------
DEFAULT                    PASSWORD_VERIFY_FUNCTION          PASSWORD  CUSTOM_PASSWORD_FUNCTION
```

O exemplo a seguir obtém todos os perfis e as funções de verificação de senha às quais eles estão associados. 

```
SELECT * FROM DBA_PROFILES WHERE RESOURCE_NAME = 'PASSWORD_VERIFY_FUNCTION';

PROFILE                    RESOURCE_NAME                     RESOURCE  LIMIT
-------------------------  --------------------------------  --------  ------------------------
DEFAULT                    PASSWORD_VERIFY_FUNCTION          PASSWORD  CUSTOM_PASSWORD_FUNCTION
RDSADMIN                   PASSWORD_VERIFY_FUNCTION          PASSWORD  NULL
```

# O procedimento create\$1passthrough\$1verify\$1fcn
<a name="Appendix.Oracle.CommonDBATasks.CustomPassword.Custom"></a>

O procedimento `create_passthrough_verify_fcn` é compatível com todas as versões do RDS para Oracle.

Você pode criar uma função personalizada para verificar senhas usando o procedimento do Amazon RDS `rdsadmin.rdsadmin_password_verify.create_passthrough_verify_fcn`. O procedimento `create_passthrough_verify_fcn` tem os seguintes parâmetros. 


****  

| Nome do parâmetro | Tipo de dados | Padrão | Obrigatório | Descrição | 
| --- | --- | --- | --- | --- | 
|  `p_verify_function_name`  |  varchar2  |  —  |  Sim  |  O nome da sua função de verificação personalizada. Esta é uma função de wrapper criada por você no esquema SYS e não contém lógica de verificação. Você atribui essa função a perfis de usuário.   | 
|  `p_target_owner`  |  varchar2  |  —  |  Sim  |  O proprietário do esquema da sua função de verificação personalizada.  | 
|  `p_target_function_name`  |  varchar2  |  —  |  Sim  |  O nome da sua função personalizada existente que contém a lógica de verificação. Sua função personalizada deve retornar um valor booliano. Sua função deverá retornar `true` se a senha é válida e `false` se a senha for inválida.   | 

O exemplo a seguir cria uma função de verificação de senha que usa a lógica da função chamada `PASSWORD_LOGIC_EXTRA_STRONG`. 

```
begin
    rdsadmin.rdsadmin_password_verify.create_passthrough_verify_fcn(
        p_verify_function_name => 'CUSTOM_PASSWORD_FUNCTION', 
        p_target_owner         => 'TEST_USER',
        p_target_function_name => 'PASSWORD_LOGIC_EXTRA_STRONG');
end;
/
```

Para associar a função de verificação a um perfil de usuário, use `alter profile`. O seguinte exemplo associa a função de verificação ao perfil de usuário `DEFAULT`. 

```
ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION CUSTOM_PASSWORD_FUNCTION;
```