

# 创建自定义函数来验证密码
<a name="Appendix.Oracle.CommonDBATasks.CustomPassword"></a>

您可以通过以下方式创建自定义密码验证函数：
+ 要使用标准验证逻辑，并将函数存储在 `SYS` 架构中，请使用 `create_verify_function` 过程。
+ 要使用自定义验证逻辑，或者避免将函数存储在 `SYS` 架构中，请使用 `create_passthrough_verify_fcn` 过程。

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

您可以使用 Amazon RDS 过程 `rdsadmin.rdsadmin_password_verify.create_verify_function` 创建自定义函数来验证密码。所有版本的 RDS for Oracle 都支持 `create_verify_function` 过程。

`create_verify_function` 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_verify_function_name`  |  varchar2  |  —  |  是  |  自定义函数的名称。将在 SYS 架构中为您创建此函数。为用户配置文件分配此函数。  | 
|  `p_min_length`  |  number  |  8  |  否  |  要求的字符的最小数量。  | 
|  `p_max_length`  |  number  |  256  |  否  |  允许的字符的最大数量。  | 
|  `p_min_letters`  |  number  |  1  |  否  |  要求的字母的最小数量。  | 
|  `p_min_uppercase`  |  number  |  0  |  否  |  要求的大写字母的最小数量。  | 
|  `p_min_lowercase`  |  number  |  0  |  否  |  要求的小写字母的最小数量。  | 
|  `p_min_digits`  |  number  |  1  |  否  |  要求的数字的最小数量。  | 
|  `p_min_special`  |  number  |  0  |  否  |  要求的特殊字符的最小数量。  | 
|  `p_min_different_chars`  |  number  |  3  |  否  |  旧密码和新密码之间需要的不同字符的最小数。  | 
|  `p_disallow_username`  |  布尔值  |  true  |  否  |  设置为 `true` 可禁止在密码中使用用户名。  | 
|  `p_disallow_reverse`  |  布尔值  |  true  |  否  |  设置为 `true` 则禁止在密码中使用反向用户名。  | 
|  `p_disallow_db_name`  |  布尔值  |  true  |  否  |  设置为 `true` 则禁止在密码中使用数据库或服务器名称。  | 
|  `p_disallow_simple_strings`  |  布尔值  |  true  |  否  |  设置为 `true` 则禁止将简单字符串用作密码。  | 
|  `p_disallow_whitespace`  |  布尔值  |  false  |  否  |  设置为 `true` 则禁止在密码中使用空格字符。  | 
|  `p_disallow_at_sign`  |  布尔值  |  false  |  否  |  设置为 `true` 以禁止在密码中使用 @ 字符。  | 

可以创建多个密码验证函数。

自定义函数的名称受到一些限制。您的自定义函数不能具有与现有系统对象相同的名称。名称长度不能超过 30 个字符。另外，名称必须包括以下字符串之一：`PASSWORD`、`VERIFY`、`COMPLEXITY`、`ENFORCE` 或 `STRENGTH`。

下面的示例创建一个名为 `CUSTOM_PASSWORD_FUNCTION` 的函数。此函数要求密码具有至少 12 个字符、2 个大写字符、1 个数字和 1 个特殊字符，并且该密码禁止使用 @ 字符。

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

要查看验证函数的文本，请查询 `DBA_SOURCE`。以下示例获取名为 `CUSTOM_PASSWORD_FUNCTION` 的自定义密码函数的文本。

```
COL TEXT FORMAT a150

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

要将您的验证函数与用户配置文件关联，请使用 `ALTER PROFILE`。以下示例将名为 `CUSTOM_PASSWORD_FUNCTION` 的验证 PL/SQL 函数与 `DEFAULT` 用户配置文件关联。`PASSWORD_VERIFY_FUNCTION` 是 Oracle 配置文件资源名称。

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

要查看哪些用户配置文件与哪些验证函数关联，请查询 `DBA_PROFILES`。以下示例获取与名为 `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
```

以下示例获取所有配置文件以及与之关联的密码验证函数。

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

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

所有版本的 RDS for Oracle 都支持 `create_passthrough_verify_fcn` 过程。

您可以使用 Amazon RDS 过程 `rdsadmin.rdsadmin_password_verify.create_passthrough_verify_fcn` 创建自定义函数来验证密码。`create_passthrough_verify_fcn` 过程具有以下参数。


****  

| 参数名称 | 数据类型 | 默认值 | 必需 | 描述 | 
| --- | --- | --- | --- | --- | 
|  `p_verify_function_name`  |  varchar2  |  —  |  是  |  自定义验证函数的名称。这是在 SYS 架构中为您创建的包装函数，它不包含任何验证逻辑。为用户配置文件分配此函数。  | 
|  `p_target_owner`  |  varchar2  |  —  |  是  |  自定义验证函数的架构所有者。  | 
|  `p_target_function_name`  |  varchar2  |  —  |  是  |  包含验证逻辑的现有自定义函数的名称。您的自定义函数必须返回布尔值。如果密码有效，您的函数应返回 `true`；如果密码无效应返回 `false`。  | 

以下示例创建的密码验证函数使用名为 `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;
/
```

要将验证函数与用户配置文件关联，请使用 `alter profile`。以下示例将验证函数与 `DEFAULT` 用户配置文件关联。

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