2010-01-05 7 views
6

"사용자"목록을 테이블에 저장하고 있습니다. 응용 프로그램의 비즈니스 로직은 현재 로그인 한 사용자에 대해이 테이블의 모든 데이터가있는 객체에 대한 참조를 갖습니다. 사용자가 올바른 액세스 권한을 갖고 있으면 작업을 수행 할 수있게하십시오.데이터베이스에 사용자 액세스 수준 저장

"액세스 수준"을 저장하는 가장 좋은 방법은 무엇입니까?

액세스 수준을 저장하는 방법 중 하나는 정수형이며 C# "플래그"를 사용하여 여러 개의 필드를 필요로하지 않고 여러 액세스 수준을 결합하는 것이 현명합니까?

Create = 1 
Read = 2 
Update = 4 
Delete = 8 
FullAcc = 16 

내가 생각하고 다른 옵션은 덜 elegent 느낌,하지만 난 그것을 많이 수행 본 적이 :

Read/Write = 1 
R/W + Delete= 2 
Full Access = 3 

궁금 해요 이유, 그것은 것 같다이다 두 번째 방법에 항목을 추가하는 것이 더 간단하지만 어느 시점에 유지하는 것이 엉망이 될 것입니다. 당신의 생각은 무엇입니까?

답변

5

나는 항상 플래그를 사용하여 첫 번째 방법을 선호했습니다. 위험은 당신이 너무 많은 수준의 권한을 얻고 열거 형을 확장하고 거대한 숫자를 사용하기 시작해야하므로 데이터베이스의 데이터 유형을 큰 int로 변경해야 할 수도 있습니다. 그러나 사용 권한과 같이 옵션의 수는 상당히 제한되어야합니다. 하나의 제안은 FullAcc를 별도의 엔티티가 아닌 Create, Read, Update 및 Delete의 합계로 정의하는 것입니다. 그렇게하면 사용자가 업데이트를 시도 할 때 Update 또는 FullAcc 권한이 있는지 확인할 필요가 없습니다.

3

각 유형의 액세스에 대해 개별 플래그를 제공하기 때문에 옵션 # 1과 함께 갈 것입니다.

변경 기록을 타임 스탬프와 함께 저장하는 것이 좋습니다.

1

나는 열거 경로를 가고 싶다. 강력한 형식의 db와 코드 (int와 enum이 잘 캐스팅 된) 사이에서 합리적으로 전송되면 FlagsAttribute를 사용하여 보안 권한을 결합 할 수 있으며 열거 형 문제와 관련하여 enums는 매우 유연합니다 (제거하지 않는 한 또는 이전에 정의 된 enum 값의 이름을 바꿉니다).

1

당신의 '깃발'아이디어는 더 융통성이있어 필요한 경우 모든 권리의 조합을 허용합니다. 'FullAcc'항목은 그러나 당신의 열거의 특정 번호로 정의하지 않아야 - 그것은 (왼쪽으로 몇 가지로,이 같은) 함께 OR 연산 다른 플래그의 조합이어야한다 :

enum Rights { Create, read, Update, FullAcc = Create | Read | Update } 

내가 볼 수있는 유일한 고통은 열거 형에 항목을 더 추가하면 FullAcc 항목을 수정 한 다음 db에서 FullAcc 레코드를 식별하고 플래그 값을 업데이트해야한다는 것입니다.

관련 문제