2008-09-13 2 views
7

일부 사용자/역할 데이터베이스 테이블에 대한 디자인이 수용 가능한지 여부에 대한 질문은 여기에서 할 수 있지만 일부 조사 후에이 질문을 건너 왔습니다 :하나의 십진수로 데이터베이스에 저장된 여러 권한 유형 (역할)

What is the best way to handle multiple permission types?

그것은 혁신적인 접근 같은데 그래서 대신 대다 관계 users_to_roles 표 중, I는 십진수 (I 감히 int 데이터 형식)으로 정의 다수의 권한을 갖는다. 이는 단일 사용자에 대한 모든 권한이 한 행에 있음을 의미합니다. 다른 질문과 대답을 읽을 때까지는 아마 이해가 안 될 것입니다.

나는이 문제를 두려워하지 않습니다. 누군가 변환 과정을 설명해 주시겠습니까? "옳은"소리는 들리지만, DB에 들어가기 전에 역할을 십진수로 변환하는 방법을 얻지 못하고, DB에서 나오는 경우 어떻게 다시 변환되는지를 알 수 없습니다. 자바를 사용하고 있지만, 당신이 그것을 외면한다면 그것은 멋질 것이다. 에

는 "개인적으로, 나는 가끔 권한 플래그 열거 형을 사용하면 및 사용할 수있는이 방법, OR, NOT 및 XOR 비트 연산 :. 여기

은 다른 질문은 삭제됩니다 오프 기회에서 원래의 답변입니다 열거의 항목. 그런 다음

[Flags] 
public enum Permission 
{ 
    VIEWUSERS = 1, // 2^0 // 0000 0001 
    EDITUSERS = 2, // 2^1 // 0000 0010 
    VIEWPRODUCTS = 4, // 2^2 // 0000 0100 
    EDITPRODUCTS = 8, // 2^3 // 0000 1000 
    VIEWCLIENTS = 16, // 2^4 // 0001 0000 
    EDITCLIENTS = 32, // 2^5 // 0010 0000 
    DELETECLIENTS = 64, // 2^6 // 0100 0000 
} 

, 당신은 AND 비트 연산자를 사용하여 여러 가지 권한을 결합 할 수 있습니다. 예를 들어

, 사용자가 & 편집 사용자를 볼 수있는 경우, 작업의 진 결과를 0000 0011입니다. 십진수로 변환 된 값은 3입니다. 그러면 한 사용자의 권한을 데이터베이스의 단일 열에 저장할 수 있습니다 (이 경우 3입니다).

응용 프로그램 내부에서, 당신은 단지 사용자가 특정 권한이 아닌지 확인 (OR) 다른 비트 연산이 필요합니다. "

+0

매우 유용한 질문 및 답변 ... –

답변

4

비트 연산을 사용합니다.

bool HasPermission(User user, Permission permission) { 
    return (user.Permission & permission) != 0; 
} 

void SetPermission(User user, Permission permission) { 
    user.Permission |= permission; 
} 

void ClearPermission(User user, Permission permission) { 
    user.Permission &= ~permission; 
} 

권한이 정수와 같은 유형에 따라 적용 할 필요가 무엇이든 유형 불구하고 게시물에 정의 된 열거 형이있다 : 의사 코드 뭔가처럼 될 것입니다. User.Permission 필드에도 동일하게 적용됩니다.

해당 연산자 (&, | = 및 & =)가 이해가되지 않는 경우 비트 연산 (비트 AND 및 비트 OR)을 읽습니다.

+0

이 기술의 단점은 권한 정의가 열거 형에 포함되어있어 데이터베이스에 무엇이 들어 있는지 이해하기 위해 응용 프로그램에 대한 액세스가 필요하다는 것입니다. –

+0

데이터베이스의 테이블에 값을 정의 할 수 있지만 (물론 외래 키를 사용할 수는 없지만) 공정한 성명서입니다. 이 "단점"은 데이터베이스의 모든 정수 기반 열거 형에 적용됩니다. – Brannon

+0

그게 문제가되면 행 기반 역할 (그리고 다 대다 관계)과 함께 갈 수 있습니다. – Brannon

3

사실, 이것은 우리가 상당히 큰 웹 응용 프로그램 내에서 권한을 결정하는 방법입니다 I '에 대한 DBA를 해요

이 그런 짓을하려는 경우, 당신은 정말 numbers table를 가진 혜택을 얻을 것입니다 그것은 훨씬 빨리 계산을 할 것입니다

기본 설정은 다음과 같은 테이블이 포함되어 있습니다... :

  1. 그룹 - 익명 인증 값을 포함하고
  2. 그룹의 보안 점은 테이블을 조인 별도의 그룹에 포함되지 않은 인증 된 사용자에 대한 한 - 사용자 및 보안 점
  3. 보안 점 많은 많은 작업을 수행하는
  4. ^2 값에 대한 항목을 포함하는 특수한 비트 마스크 번호 테이블입니다. 따라서 2 (2)에 대해 하나의 항목이 있고 3 (2 및 1)에 대해 두 개의 항목이 있습니다. 이렇게하면 매번 값을 계산하지 않아도됩니다.

먼저 사용자가 로그인했는지 확인합니다. 로그인하지 않은 경우 보안 지점에 대한 익명 인증을 반환합니다.

다음은 사용자가 EXISTSJOIN을 사용하여 보안 지점과 연결된 그룹의 구성원인지 확인합니다.일치하지 않으면 인증 된 사용자와 관련된 값을 반환합니다. 대부분의 익명 및 인증 된 기본값은 사용자가 특정 그룹에 속해야하므로 우리 시스템에서 1로 설정됩니다.

참고 : 익명 사용자가 액세스 할 수 얻을 수없는 경우, 인터페이스 할 수 있도록 상자에 로그에 걸쳐 발생 그들에 로그인하고 다시 시도합니다. 사용자는 하나 개 이상의 그룹의 멤버 인 경우

는, 우리는 그룹에 대해 정의 된 값들의 각각에 대한 비트 마스크 테이블에서 고유 한 값을 선택한다. 예를 들어, 세 그룹에 속해 있고 8 개의 권한 레벨 중 하나가 12이고 마지막 키가 36 인 경우 비트 마스크 테이블에 대한 선택은 각각 8, 8, 4 및 4와 32를 반환합니다. 별개의 작업을 수행하면 숫자 4, 8 및 32가 올바르게 마스크되어 101100으로 마스크됩니다.

해당 값은 사용자 권한 수준으로 반환되고 웹 사이트에서 처리됩니다.

의미가 있습니까?

+0

이 기술이 어떻게 작동하는지 확실히 알고 싶습니다. 깊이 생각할 필요는 없지만, 특히 DB에 저장된 내용으로 변환 프로세스를 매핑하는 방법에 대한 자세한 내용이 매우 유용합니다. –

관련 문제