2011-09-01 6 views
1

여기에 사용자 권한 우아한 방법으로 사용자 권한을 표현하는 방법은 무엇입니까?

Post 
     Guest User      Admin 
Create N  Y       Y 
Read  Y  Y       Y 
Update N Their own post ONLY  All 
Delete N  N (yes, user can't del) Y 

의 테이블 그리고 여기 상황이다. 하나의 클래스에 모든 유효성 검사 사용자 권한을 처리 할 생각입니다. 모든 작업에는 정의 된 이름이 있습니다 (예 : create_post, read_post). 또한 전달할 user_role을 갖도록하십시오 : role_guest, role_user. 유효성 검사 클래스는 모든 마법을 수행합니다. 이 디자인에 대해 어떻게 생각하십니까? 고맙습니다.

+1

다음과 같이 사용할 수 있습니다. http://en.wikipedia.org/wiki/Access_control_list – NullUserException

답변

5

bitmask을 사용할 수 있습니다.

모든 권한이 예/아니오 조건 집합 인 경우 (또는 일반화 할 수있는 경우) 매우 쉽습니다.

예제에서 작성, 읽기, 업데이트 및 삭제가 있습니다. 4 비트이므로 권한을 저장하려면 4 비트 숫자가 필요합니다. (이진수는 0000에서 1111까지 십진수로 0에서 15까지)

읽을 수있는 사람은 0100 (십진수 4)의 권한을 가지며 작성/읽기/업데이트 할 수있는 사람은 pers1010 (14 진수) . 모든 권한을 가진 관리자는 persimissions 1111 (십진수로 15)을가집니다.

PHP에서 이들을 확인하는 방법은 비트 OR 연산자 |입니다. 예를

// you could write a function getUserPermission($strUsername) 
// which returns a permission number, say 10 (1010 in binary) 
// which means he/she can create/update but not read/delete 
$userPermissions = getUserPermission("TedWong"); 

$permissionCreate = 8; // 1000; 
$permissionRead = 4; // 0100; 
$permissionUpdate = 2; // 0010; 
$permissionDelete = 1; // 0001; 

if ($userPermissions | $permissionCreate) 
{ 
    //user has permission to create 
} 

if ($userPermissions | $permissionRead) 
{ 
    //User has permission to read 
} 

if (!($userPermissions | $permissionDelete)) 
{ 
    //User doesn't have permission to delete 
} 

if ($userPermissions | $permissionUpdate && 
    $userPermissions | $permissionCreate) 
{ 
    //User has permission to create and update. 
} 

더 많은 권한을 원하는 경우에 대한

, 당신은 더 많은 비트를 도입 할 필요가있다.

예제에서 모든 게시물을 게시/삭제할 때 작성, 읽기, 삭제, UpdateOwn, UpdateAll과 같은 5 비트 권한 구조가 있습니다.

많은 권한을 가질 수 있지만 권한을 저장할 수있는 데이터 구조에 의해 제한됩니다. 예를 들어, 32 비트 정수에 사용 권한 마스크를 저장하는 경우 최대 32 개의 사용 권한 만 가질 수 있습니다.

0000 // 0: No Permissions 
0001 // 1: Delete 
0010 // 2: Update 
0011 // 3: Delete + Update 
0100 // 4: Read 
0101 // 5: Read + Delete 
0110 // 6: Read + Update 
0111 // 7: Read + Delete + Update 
1000 // 8: Create 
1001 // 9: Create + Delete 
1010 // 10: Create + Update 
1011 // 11: Create + Delete + Update 
1100 // 12: Create + Read 
1101 // 13: Create + Read + Delete 
1110 // 14: Create + Read + Update 
1111 // 15: Create + Read + Delete + Update 

는 그래서가 6 ( 이진0110 동일하다) 권한을 부여하는 INTEGER을 의미한다 : 여기

는 예를 들면 4 비트의 사용 권한의 전체 목록 읽기/업데이트는 가능하지만 작성/삭제는 할 수 없습니다. 동일한 방법으로 각 정수에는 이와 관련된 사용 권한 집합이 있습니다. 해당 정수를 나타내는 많은 비트 (정수 32 개)를 정수에 최대 한도까지 저장할 수 있습니다.

4 비트 정수 (십진수 0-15)로 4 개의 예/아니오 권한을 얻을 수 있음을 알 수 있습니다. 32- 정수를 사용하는 경우 최대 32 개의 예/아니오 권한을 가질 수 있습니다.

정수의 최대 크기를 결정하는 방법은 PHP documentation을 확인하십시오. (PHP 파서를 실행중인 플랫폼에 따라 다름). 필자는 일반적으로 32 비트 시스템/OS가 32 비트 정수를 허용하고 64 비트 시스템/OS가 64 비트 정수를 허용한다고 생각합니다.

비트 마스크와 다른 방법의 장점/단점에 대한 논의는 these other threads을 확인하십시오.

+0

내가 볼 수있는 권한은 얼마인가? 나는 이것이 다음 큰 허가에서 여러 번 볼 수 있는데, 그것은 매우 큰 int가 될 것인가? 본인에게 읽기 및 업데이트 권한 만 있고 나의 허가가 6 인 경우, 맞습니까? – DNB5brims

+0

아니요, 네 가지 권한이 있다면 4 비트 비트 마스크 = 0-15입니다. 5 가지 권한이 있다면 0-31이됩니다. 6 permissions = 0-63, 등등. 예를 들면, 각 사용자는 0과 15 사이의 십진수 권한을 갖습니다. 0은 권한 없음을 의미하고 15은 모든 권한을 의미합니다. – Ozzah

+0

왜 6이 아니겠습니까? 읽기는 4이고, 업데이트는 2 ... 나는이 두 가지를 가지고 있는데, 왜 그것이 6이 아닌가? – DNB5brims

관련 문제