Oracle/Oh Oracle

AUTHID CURRENT_USER(실제 수행 유저 ) VS AUTHID DEFINER(컴파일 유저 기준)

darkturtle26 2023. 1. 2. 19:00

AUTHID CURRENT_USER VS AUTHID DEFINER


1. FUNCTION, PACKAGE, PROCEDURE, TYPE 생성 시, AHTHID 설정 값을 통해서,

    OBJECT 내에서 접근하는 OBJECT 에 대한 권한 체크 방식으로 정의 할수 있다.

2. AUTHID DEFINER : 해당 OBJECT 를 DEFINER , 즉 생성한 생성자에 대한 권한 체크 [ Default ] 
3. AUTHID CURRENT_USER : 해당 OBJECT를 호출한 호출자에 대한 권한 체크 

4. 보통 (2)으로 생성 하면 , 문제가 없음 

5. (3)방식으로 생성 하는 경우는 유저별 권한을 구분하고자 할때 (EX) 복제 구성 환경 등 )

 

매뉴얼이 최고지 >> Oracle_Manual

 

테스트 내용  

 

-- # 1. 테스트 유저 생성 
create user test_user identified by qwer1234 ;
User created.

grant connect to test_user ;
Grant succeeded.

-- # 2. 테스트 테이블 및 프로시져 생성( AUTHID는 설정 없음 =  DEFAULT  ) 
--      Public Synonym 도 추가 함 
CREATE TABLE INSERT_TEST ( A1 DATE, A2 VARCHAR2(30)) ; 
CREATE PUBLIC SYNONYM  INSERT_TEST for INSERT_TEST ;

CREATE OR REPLACE PROCEDURE INSERT_TEST_PRC
IS
BEGIN
-- AUTHID 설정을 특별히 하지 않았으므로, AUTHID CURRENT_USER 이다. 
INSERT INTO INSERT_TEST VALUES ( SYSDATE, TO_CHAR(SYSDATE,'YYYY/MM/DD') ) ;
COMMIT ;
END ;

-- CASE 1 ) 테이블 조회 권한 + 프로시져 수행 권한 + 프로시져 수행 --> 성공 
GRANT SELECT ON INSERT_TEST TO TEST_USER ; 
GRANT EXECUTE ON INSERT_TEST_PRC TO TEST_USER ;

-- 권한 체크 ( 테이블 조회 + 프로시져 수행 권한  ) 
SET LINESIZE 180
COL TABLE_NAME FOR A20
COL GRANTEE FOR A30
COL PRIVILEGE FOR A30
SELECT TABLE_NAME, GRANTEE, PRIVILEGE 
FROM   DBA_TAB_PRIVS 
WHERE  GRANTEE='TEST_USER';

EXECUTE SCOTT.INSERT_TEST_PRC;
SELECT * FROM SCOTT.INSERT_TEST ; 
TABLE_NAME           GRANTEE                        PRIVILEGE
-------------------- ------------------------------ ------------------------------
INSERT_TEST          TEST_USER                      SELECT
INSERT_TEST_PRC      TEST_USER                      EXECUTE


-- 세션 설정 
SET sqlprompt "_USER'@'_CONNECT_IDENTIFIER> "
https://estenpark.tistory.com/293

CONN TEST_USER/TEST_USER
-- 정상 수행 확인 
TEST_USER@oracle19>  SELECT * FROM SCOTT.INSERT_TEST ;
no rows selected

TEST_USER@oracle19> EXECUTE SCOTT.INSERT_TEST_PRC;
PL/SQL procedure successfully completed.

TEST_USER@oracle19>  SELECT * FROM SCOTT.INSERT_TEST ;
A1        A2
--------- ------------------------------
02-JAN-23 2023/01/02                    <<< 정상 수행 확인 


-- CASE 2) INSERT_TEST_PRC 를 AUTHID CURRENT_USER 추가 
CREATE OR REPLACE PROCEDURE INSERT_TEST_PRC
authid current_user
IS
BEGIN
-- AUTHID 설정을 특별히 하지 않았으므로, AUTHID CURRENT_USER 이다. 
INSERT INTO INSERT_TEST VALUES ( SYSDATE, TO_CHAR(SYSDATE,'YYYY/MM/DD') ) ;
COMMIT ;
END ;


COL TABLE_NAME FOR A20
COL GRANTEE FOR A30
COL PRIVILEGE FOR A30
SELECT TABLE_NAME, GRANTEE, PRIVILEGE 
FROM   DBA_TAB_PRIVS 
WHERE  GRANTEE='TEST_USER';

TABLE_NAME           GRANTEE                        PRIVILEGE
-------------------- ------------------------------ ------------------------------
INSERT_TEST          TEST_USER                      SELECT
INSERT_TEST_PRC      TEST_USER                      EXECUTE

-- 테스트 전 데이타 일괄 삭제 
SCOTT@oracle19> truncate table scott.insert_test ;
Table truncated.


TEST_USER@oracle19> SELECT * FROM SCOTT.INSERT_TEST ;
no rows selected

TEST_USER@oracle19> EXECUTE SCOTT.INSERT_TEST_PRC;
BEGIN SCOTT.INSERT_TEST_PRC; END;
*
ERROR at line 1:
ORA-01031: insufficient privileges                    <<<< 권한 없음 오류 발생 
ORA-06512: at "SCOTT.INSERT_TEST_PRC", line 6
ORA-06512: at line 1

TEST_USER@oracle19> SELECT * FROM SCOTT.INSERT_TEST ;
no rows selected

TEST_USER@oracle19>


-- CASE 3) Case2 상태에서 추가로 INSERT_TEST INSERT 권한 부여 
GRANT INSERT ON INSERT_TEST TO TEST_USER ; 

SET LINESIZE 180
COL TABLE_NAME FOR A20
COL GRANTEE FOR A30
COL PRIVILEGE FOR A30
SELECT TABLE_NAME, GRANTEE, PRIVILEGE 
FROM   DBA_TAB_PRIVS 
WHERE  GRANTEE='TEST_USER';
TABLE_NAME           GRANTEE                        PRIVILEGE
-------------------- ------------------------------ ------------------------------
INSERT_TEST          TEST_USER                      INSERT
INSERT_TEST          TEST_USER                      SELECT
INSERT_TEST_PRC      TEST_USER                      EXECUTE

TEST_USER@oracle19>  SELECT * FROM SCOTT.INSERT_TEST ;
no rows selected

TEST_USER@oracle19> EXECUTE SCOTT.INSERT_TEST_PRC;
PL/SQL procedure successfully completed.

TEST_USER@oracle19>  SELECT * FROM SCOTT.INSERT_TEST ;
A1        A2
--------- ------------------------------
02-JAN-23 2023/01/02                     <<<< 프로시져 통해 정상 데이타 입력 확인 

TEST_USER@oracle19>

-- Oracle Object 찾기 순서
-- SQL 이나 PL/SQL 에서 OBJECT 는 찾는 순서는 아래와 같다.
-- 본인 OBJECT -> Private Object -> Public Object 순으로 

-- TEST_USER 로 Private Synonym 을 생성 하는 것도 방법이지만
-- 계정별로 이렇게생성하기엔 손이 많이 가니,
-- 가급적 Public Synonym 을 생성한다.