

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 建立自訂函數以驗證密碼
<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`  |  數字  |  8  |  否  |  需要的字元數下限。  | 
|  `p_max_length`  |  數字  |  256  |  否  |  允許的字元數上限。  | 
|  `p_min_letters`  |  數字  |  1  |  否  |  需要的字母數下限。  | 
|  `p_min_uppercase`  |  數字  |  0  |  否  |  需要的大寫字母數下限。  | 
|  `p_min_lowercase`  |  數字  |  0  |  否  |  需要的小寫字母數下限。  | 
|  `p_min_digits`  |  數字  |  1  |  否  |  需要的數字下限。  | 
|  `p_min_special`  |  數字  |  0  |  否  |  需要的特殊字元數下限。  | 
|  `p_min_different_chars`  |  數字  |  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`。下列範例會將名為 的驗證 PL/SQL 函數`CUSTOM_PASSWORD_FUNCTION`與`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;
```