티스토리 뷰

웹개발

권한 설계하기

rangrangerang 2020. 7. 1. 10:19

회사에서 권한을 설계해봤다.

1. 요구사항 분석

이번 작업은 회사마스터, 회사 서브마스터, 업체마스터가 있는데 업체 마스터가 관리할 수 있는 업체 서브마스터 계정을 추가하는 작업이다.

 

회사 마스터

회사 서브마스터

업체 마스터

업체 서브 마스터

로그인

 O 

 O 

 X 

 X 

로그아웃

 X 

 X 

 O 

 X 

등록

 X 

 X 

 O 

 △(지정시

수정

 X 

 X 

 O 

 △(지정시

삭제

 X 

 X 

 O 

 △(지정시

생성

 O 

 O 

 O 

 X 

업체 서브마스터는 업체 마스터가 계정을 생성해줄때  3개의 권한을 선택적으로 줄 수 있다.

예를 들어 권한이 A, B, C, D 네가지가 있다고 하면 마스터가 서브마스터 계정을 생성할 때 다중으로 선택 가능하다.

 

2. 설계

먼저 기존에는 변수를 둬서 권한을 관리하고 있었다.

그래서 나는 여기에 업체 서브마스터 권한을 추가했다.

 auth_flag
회사 마스터101
회사 서브마스터102
업체 마스터201
업체 서브마스터202

회사 마스터, 회사 서브마스터, 업체 마스터의 경우 비교적 정해져있는 권한을 부여받는다면 업체 서브마스터의 경우 다양한 권한을 유동적으로 부여받는다. 이것을 어떻게 처리할지 몇가지 방법을 고민해봤다.

 

1.필드 추가 형식으로 권한테이블 생성

 

 

이 방법은 새로운 권한이 생길때마다 column이 늘어난다.

 

2. key-value 형식으로 권한테이블 생성

 

 

두번째 방법은 키 벨류 형식으로 권한이 늘어날때마다 row가 늘어난다.

 

두 방법 모두 새로운 권한이 추가됐을때 모든 계정의 데이터를 추가하거나, 수정해야한다는 불편함이 있다. 그래서 과장님의 조언을 받아 비트연산을 활용하기로 했다.

3. 비트연산

비트연산은 대학교때 "이걸 어디에 써?" 라고 생각하며 배웠던 내용이었다. 근데 다중선택에 사용해보니 매우 편리했다.

비트연산관련 정보는 아래 블로그 글을 참고했다.

http://blog.freezner.com/archives/1287

 

3. 구현

실제로 php에서 구현은 아래와 같이 했다.

<?php
define('MASTER', 	 	101);
define('SUB_MASTER', 		102);
define('PARTNER_MASTER', 	201);
define('PARTNER_SUB_MASTER', 	202);

define('AUTH_LOGIN',  	1);     
define('AUTH_LOGOUT',  	2);    
define('AUTH_REGISTER', 4);     
define('AUTH_UPDATE',   8);     
define('AUTH_DELETE',   16);    
define('AUTH_CREATE',   32);    

$auth_arr = array(
    '101' => array(AUTH_LOGIN, AUTH_CREATE),   
    '102' => array(AUTH_LOGIN, AUTH_CREATE),   
    '201' => array(AUTH_LOGOUT, AUTH_REGISTER, AUTH_UPDATE, AUTH_DELETE, AUTH_CREATE),
    '202' => array()    // 서브마스터
);

?>

 

// 참고
// 비트연산 예시 -> MASTER 계정일 경우
// 101(MASTER) => 1(AUTH_LOGIN)  + 32(AUTH_CREATE) = 33

$auth_101 = AUTH_LOGIN + AUTH_CREATE // 33
if($auth_101 & 2) {    // 로그인 권한이 있는지 확인
   echo 'true';
} else {
   echo 'false';
}
=> ture

 

업체 서브마스터의 경우는 db에 bit라는 칼럼을 추가해 가입할 때 선택한 권한 값을 계산해 넣어주었다. 예를 들어 AUTH_LOGIN, AUTH_LOGOUT 기능만 있는 업체 서브마스터라면 회원가입할 때 1(AUTH_LOGIN)+2(AUTH_LOGOUT)= 3 을 bit 칼럼에 넣어준다.

그리고 사용할 때에는 php에서 처음 유저정보를 가져올 때 권한을 계산해 배열에 넣어주었다. 코드는 아래와 같다.

// 서브마스터 권한 처리
if(AUTH_FLAG == PARTNER_SUB) {
  foreach ($AUTH_SUBMASTER_TXT as $k => $v) {
    if( $user['bit'] & $k){
    	array_push($auth_arr[PARTNER_SUB], $k);
    }
  }
}

 

실제로는 아래와 같은 함수를 만들어서 권한을 체크했다.

function checkAuth($auth, $auth_arr) {
    if(in_array($auth, $auth_arr[AUTH_FLAG])) {
        return true;
    } else {
        return false;
    }
}

 

'웹개발' 카테고리의 다른 글

[PHP - Laravel] 라라벨 디버그모드 설정  (2) 2020.01.09
[POSTMAN] POST로 보냈는데 GET으로 인식하는 문제  (7) 2020.01.09
JWT  (1) 2019.07.12
쿠키/세션/캐시  (1) 2019.07.12
HTTP vs HTTPS  (1) 2019.07.12
댓글