lock/unlock کردن کاربران بدون داشتن مجوز alter user

lock/unlock کردن کاربران بدون داشتن مجوز alter user

قصد داریم به کاربری “مجوز unlock کردن کاربران دیگر” را اهدا کنیم! می دانیم که این کار با دادن مجوز alter user به آن کاربر، قابل انجام خواهد بود منتها این مجوز، قابلیتهای دیگری چون تغییر پسورد کاربران، قفل کردن آنها و … را هم به آن کاربر خواهد داد!

در نتیجه، اهدای مجوز alter user، گزینه مناسبی برای این کار نخواهد بود و باید به دنبال راه حل دیگری برای حل این مسئله باشیم!

یکی از این راه حلها می تواند ایجاد یک پروسیجر و استفاده از definers rights باشد برای مثال، پروسیجر زیر( unlock_user) این هدف را تامین خواهد کرد:

CREATE OR REPLACE PROCEDURE unlock_user( p_username IN VARCHAR2 )  AS

     v_num_superusers NUMBER := 0 ;

     v_num_users NUMBER := 0 ;

     v_num_locked NUMBER := 0 ;

  BEGIN

     /* Check account exists */

     SELECT COUNT(*) INTO v_num_users FROM dba_users WHERE username = UPPER ( p_username ) ;

     IF v_num_users = 1     THEN

        /* Check account is currently locked */

        SELECT COUNT(*) INTO v_num_locked FROM dba_users WHERE username = UPPER ( p_username ) and account_status LIKE ‘%LOCKED%’ ;

        IF v_num_locked = 1        THEN

           /* Check is not a superuser */

           SELECT COUNT(*) INTO v_num_superusers FROM sys.dba_role_privs WHERE grantee = UPPER(p_username) AND granted_role IN (‘DBA’,’IMP_FULL_DATABASE’) ;

           IF v_num_superusers = 0           THEN

              /* Unlock account */

              EXECUTE IMMEDIATE ‘alter user ‘ || p_username || ‘ account unlock’ ;

              dbms_output.put_line ( ‘Success : ‘ || p_username || ‘ unlocked.’ ) ;

           ELSE

              dbms_output.put_line ( ‘Warning : ‘ || p_username || ‘ is a superuser account, which cannot be unlocked by this utility, so no action taken.’ ) ;

           END IF ;

        ELSE

           dbms_output.put_line ( ‘Warning : ‘ || p_username || ‘ is not currently locked, so no action taken.’ ) ;

        END IF ;

     ELSE

       dbms_output.put_line ( ‘Error : ‘ || p_username || ‘ does not exist, please check input and try again.’ ) ;

     END IF ;

  END ;

  /

پرسیجر unlock_user نام کاربری که قرار است از حالت lock خارج شود را دریافت کرده و پس از بررسی وضیعت و مجوزهای آن، دستور alter user را اجرا می کند! البته با بهره مندی از ویژگی definer rights!

برای مثال با اهدای مجوز اجرای این پروسیجر به کاربر A، این کاربر می تواند افراد غیر dba را از حالت lock خارج کند:

SQL> grant execute on unlock_user to a;

SQL> conn a/a

SQL> exec sys.unlock_user(‘B’);

PL/SQL procedure successfully completed

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *