

# Creación de funciones personalizadas para comprobar contraseñas
<a name="Appendix.Oracle.CommonDBATasks.CustomPassword"></a>

Puede crear una función personalizada de verificación de contraseñas de las siguientes maneras.
+ Para usar la lógica de verificación estándar y guardar la función en el esquema `SYS`, utilice el procedimiento `create_verify_function`. 
+ Para usar la lógica de verificación personalizada y evitar guardar la función en el esquema `SYS`, utilice el procedimiento `create_passthrough_verify_fcn`. 

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

Puede crear una función personalizada para comprobar las contraseñas mediante el procedimiento de Amazon RDS `rdsadmin.rdsadmin_password_verify.create_verify_function`. El procedimiento `create_verify_function` admite todas las versiones de RDS para Oracle.

El procedimiento `create_verify_function` tiene los siguientes parámetros. 


****  

| Nombre del parámetro | Tipo de datos | Valor predeterminado | Obligatorio | Descripción | 
| --- | --- | --- | --- | --- | 
|  `p_verify_function_name`  |  varchar2  |  —  |  Sí  |  El nombre de la función personalizada. Esta función se crea automáticamente en el esquema SYS. Esta función se asigna a los perfiles de usuario.   | 
|  `p_min_length`  |  número  |  8  |  No  |  El número mínimo necesario de caracteres.  | 
|  `p_max_length`  |  número  |  256  |  No  |  El número máximo de caracteres permitido.  | 
|  `p_min_letters`  |  número  |  1  |  No  |  El número mínimo necesario de letras.  | 
|  `p_min_uppercase`  |  número  |  0  |  No  |  El número mínimo necesario de letras mayúsculas.  | 
|  `p_min_lowercase`  |  número  |  0  |  No  |  El número mínimo necesario de letras minúsculas.  | 
|  `p_min_digits`  |  número  |  1  |  No  |  El número mínimo necesario de dígitos.  | 
|  `p_min_special`  |  número  |  0  |  No  |  El número mínimo necesario de caracteres especiales.  | 
|  `p_min_different_chars`  |  número  |  3  |  No  |  El número mínimo de caracteres diferentes necesarios entre la contraseña antigua y la nueva.  | 
|  `p_disallow_username`  |  booleano  |  true  |  No  |  Establezca esta opción en `true` para no permitir el nombre de usuario en la contraseña.  | 
|  `p_disallow_reverse`  |  booleano  |  true  |  No  |  Establézcalo en `true` para impedir que se use el nombre de usuario a la inversa en la contraseña.  | 
|  `p_disallow_db_name`  |  booleano  |  true  |  No  |  Establézcalo en `true` para impedir que se use el nombre de la base de datos o del servidor en la contraseña.  | 
|  `p_disallow_simple_strings`  |  booleano  |  true  |  No  |  Establézcalo en `true` para impedir que se usen cadenas sencillas en la contraseña.  | 
|  `p_disallow_whitespace`  |  booleano  |  false  |  No  |  Establézcalo en `true` para impedir que se usen caracteres de espacio en blanco en la contraseña.  | 
|  `p_disallow_at_sign`  |  booleano  |  false  |  No  |  Establézcalo en `true` para impedir que se use el carácter @ en la contraseña.  | 

Puede crear distintas funciones de verificación de contraseñas.

El nombre de la función personalizada está sujeto a ciertas restricciones. Su función personalizada no puede tener el mismo nombre que un objeto de sistema existente. El nombre no puede tener más de 30 caracteres de longitud. Asimismo, el nombre debe incluir una de las siguientes cadenas: `PASSWORD`, `VERIFY`, `COMPLEXITY`, `ENFORCE` o `STRENGTH`. 

El siguiente ejemplo crea una función con el nombre `CUSTOM_PASSWORD_FUNCTION`. La función requiere que una contraseña tenga al menos 12 caracteres, 2 caracteres en mayúsculas, 1 dígito y 1 carácter especial, y que la contraseña no incluya el carácter @. 

```
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 el texto de la función de verificación, realice una consulta de `DBA_SOURCE`. En el siguiente ejemplo se obtiene el texto de una función de contraseña personalizada llamada `CUSTOM_PASSWORD_FUNCTION`. 

```
COL TEXT FORMAT a150

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

Para asociar la función de verificación a un perfil de usuario, utilice `ALTER PROFILE`. En el siguiente ejemplo se asocia una función de verificación PL/SQL llamada `CUSTOM_PASSWORD_FUNCTION` al perfil de usuario `DEFAULT`. `PASSWORD_VERIFY_FUNCTION` es el nombre del recurso del perfil de Oracle. 

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

Para ver qué perfiles de usuario están asociados a qué función de verificación, consulte `DBA_PROFILES`. En el siguiente ejemplo se obtienen los perfiles asociados a la función de verificación personalizada llamada `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
```

En el siguiente ejemplo se obtienen todos los perfiles y las funciones de verificación de contraseñas a las que están asociados. 

```
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
```

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

El procedimiento `create_passthrough_verify_fcn` admite todas las versiones de RDS para Oracle.

Puede crear una función personalizada para comprobar las contraseñas mediante el procedimiento de Amazon RDS `rdsadmin.rdsadmin_password_verify.create_passthrough_verify_fcn`. El procedimiento `create_passthrough_verify_fcn` tiene los siguientes parámetros. 


****  

| Nombre del parámetro | Tipo de datos | Valor predeterminado | Obligatorio | Descripción | 
| --- | --- | --- | --- | --- | 
|  `p_verify_function_name`  |  varchar2  |  —  |  Sí  |  El nombre de la función de verificación personalizada. Es una función contenedora que se crea automáticamente en el esquema SYS y no contiene ninguna lógica de verificación. Esta función se asigna a los perfiles de usuario.   | 
|  `p_target_owner`  |  varchar2  |  —  |  Sí  |  El propietario del esquema de la función de verificación personalizada.  | 
|  `p_target_function_name`  |  varchar2  |  —  |  Sí  |  El nombre de la función personalizada existente que contiene la lógica de verificación. La función personalizada debe devolver un valor booleano. La función debe devolver `true` si la contraseña es válida y `false` si la contraseña no es válida.   | 

En el siguiente ejemplo se crea una función de verificación de contraseñas que utiliza la lógica de la función `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 asociar la función de verificación a un perfil de usuario, utilice `alter profile`. En el siguiente ejemplo se asocia la función de verificación al perfil de usuario `DEFAULT`. 

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