문제

일부 사용자/역할 데이터베이스 테이블에 대한 내 디자인이 허용 가능한지 여부에 대해 여기에 질문을 하려고 했지만 몇 가지 조사 후에 다음 질문을 발견했습니다.

여러 권한 유형을 처리하는 가장 좋은 방법은 무엇입니까?

혁신적인 접근 방식처럼 들리므로 다대다 관계 users_to_roles 테이블 대신 단일 십진수(int 데이터 유형으로 추정)로 정의된 여러 권한이 있습니다.이는 단일 사용자에 대한 모든 권한이 한 행에 있음을 의미합니다.아마도 다른 질문과 답변을 읽기 전까지는 이해가 되지 않을 것입니다.

나는 이것에 대해 내 두뇌를 이해할 수 없습니다.누군가 변환 과정을 설명해 주실 수 있나요?"올바른" 것처럼 들리지만 db에 들어가기 전에 역할을 10진수로 변환하는 방법과 db에서 나올 때 다시 변환되는 방법을 이해하지 못합니다.나는 Java를 사용하고 있지만, 그것을 없애 버리면 그것도 좋을 것입니다.

다른 질문이 삭제될 경우의 원래 답변은 다음과 같습니다.

"개인적으로 나는 때때로 플래그가 지정된 권한 목록을 사용합니다.이 방법으로 열거 항목에 AND, 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)이 필요합니다."

도움이 되었습니까?

해결책

비트 연산을 사용합니다.의사 코드는 다음과 같습니다.

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)을 읽어보세요.

다른 팁

실제로 이것이 제가 DBA인 상당히 큰 웹 애플리케이션 내에서 권한을 결정하는 방법입니다.

이런 일을 하려고 한다면, 숫자 테이블.계산이 훨씬 빨라질 것입니다.

기본 설정에는 다음 표가 포함됩니다.

  1. 그룹 - 다수의 사용자 및 보안 지점을 수행합니다.
  2. 보안 포인트 - 익명 인증에 대한 값과 별도의 그룹에 속하지 않은 인증된 사용자에 대한 값을 포함합니다.
  3. 그룹 보안 포인트 조인 테이블
  4. ^2 값에 대한 항목을 포함하는 특수 BitMask 숫자 테이블입니다.따라서 2(2)에 대한 하나의 항목과 3(2와 1)에 대한 두 개의 항목이 있습니다.이렇게 하면 매번 값을 계산할 필요가 없습니다.

먼저 사용자가 로그인되어 있는지 확인합니다.그렇지 않은 경우 보안 포인트에 대한 익명 인증을 반환합니다.

다음으로 간단한 방법을 통해 사용자가 보안 포인트와 연결된 그룹의 구성원인지 확인합니다. EXISTS 사용하여 JOIN.그렇지 않은 경우 인증된 사용자와 관련된 값을 반환합니다.귀하가 특정 그룹에 속하도록 요구하기 때문에 대부분의 익명 및 인증 기본값은 시스템에서 1로 설정됩니다.

메모: 익명 사용자에게 액세스 권한이 부여되지 않으면 인터페이스는 해당 사용자를 로그인 상자로 넘겨 로그인하고 다시 시도할 수 있도록 합니다.

사용자가 ~이다 하나 이상의 그룹의 구성원인 경우 그룹에 대해 정의된 각 값에 대해 BitMask 테이블에서 고유한 값을 선택합니다.예를 들어, 세 그룹에 속하고 하나의 인증 수준이 8, 하나는 12, 마지막 인증 수준은 36인 경우 비트 마스크 테이블에 대한 선택은 각각 8, 8, 4, 4, 32를 반환합니다.구별을 수행함으로써 우리는 101100으로 정확하게 비트 마스크되는 숫자 4, 8 및 32를 얻습니다.

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

말이 되나요?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top