همانطور که می دانید از طریق پروفایل می توان برای هر کاربر در دو سطح مصرف منابع و password complexity محدودیتهایی را اعمال کرد. پروفایلها در سطح کاربر قابل تنظیم هستند و هر کاربر می تواند تنها یک پرفایل داشته باشد.
در اوراکل 21c نوع جدیدی از پروفایل تحت عنوان Mandatory Profile ارائه شد که در سطح root container قابل ایجاد است و می توان این دسته از پروفایلها را برای یک یا چند pdb تنظیم کرد که در این صورت، پالیسی مربوط به این پروفایل، برای همه کاربران موجود در آن pdb اعمال خواهد شد.
Mandatory Profile صرفا قرار است در زمینه تنظیم پسورد برای کاربران محدودیت ایجاد کند به این صورت که مثلا پسورد کاربر حداقل n کارکتر داشته باشد. این قبیل محدودیتها از طریق ایجاد یک FUNCTION و تنظیم پارامتر PASSWORD_VERIFY_FUNCTION(در پروفایل) قابل اعمال هستند.
مثال: در این مثال با ساخت تابع func_pass_limit و استفاده از ان در یک Mandatory Profile، قصد داریم محدودیتی را ایجاد کنیم که بر اساس آن، پسورد کاربران در pdb5 و pdb8 حداقل 5 کاراکتر داشته باشند:
ایجاد تابع:
SQL> CREATE OR REPLACE FUNCTION func_pass_limit(username VARCHAR2,password VARCHAR2,old_password VARCHAR2)
RETURN BOOLEAN IS
BEGIN
IF ora_complexity_check(password, chars => 5) THEN
return(true);
END IF;
RETURN(false);
END;
/
Function created.
ایجاد Mandatory Profile:
SQL> CREATE MANDATORY PROFILE c##EJBARI_PROF LIMIT PASSWORD_VERIFY_FUNCTION func_pass_limit CONTAINER = ALL;
Profile created
تنظیم Mandatory Profile برای یک pdb با کمک پارامتر mandatory_user_profile انجام می شود. این پارامتر در سطح pdb قابل تنظیم است.
در ادامه Mandatory Profile ایجاد شده را برای pdb5 و pdb8 تنظیم می کنیم:
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
———- ————- ———- ———-
2 PDB$SEED READ ONLY NO
3 PDB1 READ WRITE NO
4 PDB5 READ WRITE NO
6 PDB8 READ WRITE NO
SQL> alter session set container=PDB5;
Session altered.
SQL> show parameter mandatory_user_profile;
NAME TYPE VALUE
———————————— ———– ——————————
mandatory_user_profile string
SQL> alter system set mandatory_user_profile=c##EJBARI_PROF;
System altered.
SQL> alter session set container=PDB8;
Session altered.
SQL> show parameter mandatory_user_profile;
NAME TYPE VALUE
———————————— ———– ——————————
mandatory_user_profile string
SQL> alter system set mandatory_user_profile=c##EJBARI_PROF;
System altered.
بعد از تنظیم این پارامتر، پسورد کاربر usef را در pdb5 و pdb1 تغییر خواهیم داد:
SQL> alter session set container=PDB5;
Session altered.
SQL> create user vahid identified by a;
ORA-28219: password verification failed for mandatory profile
ORA-20000: password length less than 5 characters
SQL> create user vahid identified by a1234;
User created.
SQL> create user vahid identified by a;
User created.
اگر در local profileها سیاستی را در مورد حداقل تعداد کارکترهای پسورد اعمال کرده باشیم، کماکان پسورد انتخاب شده توسط کاربر، باید شرایط تعیین شده در Mandatory Profile را هم دارا باشد.
برای مثال، اگر(در ادامه سناریو قبلی) در pdb5، برای local profileی حداقل password length برابر با 3 در نظر گرفته شود، باز هم Mandatory Profile مانع از ایجاد کاربر خواهد شد:
SQL> CREATE OR REPLACE FUNCTION local_func(username VARCHAR2,password VARCHAR2,old_password VARCHAR2)
RETURN BOOLEAN IS
BEGIN
IF ora_complexity_check(password, chars => 3) THEN
return(true);
END IF;
RETURN(false);
END;
/
Function created.
SQL> create profile local_prf limit PASSWORD_VERIFY_FUNCTION local_func;
Profile created
SQL> alter user vahid profile local_prf;
User altered
SQL> alter user vahid identified by abc;
ORA-28219: password verification failed for mandatory profile
ORA-20000: password length less than 5 characters
البته اگر حداقل password length در local profile به عدد بیشتری تنظیم شود، اولویت با local profile خواهد بود:
SQL>CREATE OR REPLACE FUNCTION local_func(username VARCHAR2,password VARCHAR2,old_password VARCHAR2)
RETURN BOOLEAN IS
BEGIN
IF ora_complexity_check(password, chars => 7) THEN
return(true);
END IF;
RETURN(false);
END;
/
Function created.
SQL> alter user vahid identified by abcde;
ORA-28003: password verification for the specified password failed
ORA-20000: password length less than 7 characters
SQL> alter user vahid identified by abcdefg;
User altered
در پروفایلهای از نوع Mandatory، پارامتر PASSWORD_VERIFY_FUNCTION تنها پارامتر قابل استفاده خواهد بود و مابقی پارامترهای Mandatory Profile یا قابل تنظیم نیستند و یا در صورت تنظیم، محدودیتی برای کاربران ایجاد نمی کنند:
SQL> alter profile c##mand limit PASSWORD_LIFE_TIME 1;
ORA-02387: invalid password parameter for mandatory profile
برای شناسایی Mandatory Profileها می توان به ویوی dba_profiles رجوع کرد:
SQL> select distinct profile from dba_profiles where mandatory=’YES’;
PROFILE
—————
C##EJBARI_PROF