2008-08-04 8 views
17

많은 다른 유형의 사용 권한을 제공해야하는 다음과 같은 시나리오가 자주 발생합니다. 나는 주로 SQL 서버 2000여러 권한 유형을 처리하는 가장 좋은 방법은 무엇입니까?

시나리오 내가 다른 매개 변수에 사용할 수 있습니다 동적 권한 시스템을 제공 할

와 ASP.NET/VB.NET을 사용합니다. 부서 또는 특정 사람에게 응용 프로그램에 대한 액세스 권한을 부여하려고한다고 가정 해 봅시다. 그리고 우리가 계속 성장하는 수많은 응용 프로그램을 가지고 있다고 가정하십시오.

과거에 저는 이것을하기 위해 다음 두 가지 방법 중 하나를 선택했습니다.

1) 매개 변수를 적용하는 방법을 결정하는 데 사용되는 특수 열이있는 단일 사용 권한 테이블을 사용하십시오. 이 예의 특수 열은 TypeID 및 TypeAuxID입니다. SQL은 다음과 같이 보입니다.

SELECT COUNT(PermissionID) 
FROM application_permissions 
WHERE 
(TypeID = 1 AND TypeAuxID = @UserID) OR 
(TypeID = 2 AND TypeAuxID = @DepartmentID) 
AND ApplicationID = 1 

2)를 모두 함께 참여, 각 권한 유형에 대한 매핑 테이블을 사용합니다.

SELECT COUNT(perm.PermissionID) 
FROM application_permissions perm 
LEFT JOIN application_UserPermissions emp 
ON perm.ApplicationID = emp.ApplicationID 
LEFT JOIN application_DepartmentPermissions dept 
ON perm.ApplicationID = dept.ApplicationID 
WHERE [email protected] 
    AND ([email protected] OR [email protected] OR 
(emp.UserID IS NULL AND dept.DeptID IS NULL)) AND ApplicationID = 1 
ORDER BY q.QID ASC 

내 생각

내가 예제 이해가 있기를 바랍니다. 나는 그들을 함께 자갈을했다.

첫 번째 예제는 작업량이 적지 만 어느 쪽도 최상의 대답이라고 생각하지 않습니다. 이 문제를 해결할 더 좋은 방법이 있습니까?

답변

10

나는 John Downey에게 동의합니다.

개인적으로 개인적으로, 때때로 사용 권한의 플래그가 지정된 열거 형을 사용합니다. 이렇게하면 열거 항목에 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 비트 연산자를 사용하여 여러 권한을 결합 할 수 있습니다. 사용자가 & 편집 사용자를 볼 수 있습니다 예를 들어

는 작업의 이진 결과는 3
그런 다음 데이터베이스의 단일 컬럼으로 한 사용자의 권한을 저장할 수있다 진수로 변환 0011 0000 (이다 우리의 경우에는 3이 될 것입니다.

응용 프로그램 내에서 사용자에게 특정 사용 권한이 있는지 여부를 확인하기 위해 다른 비트 단위 연산 (OR) 만 필요합니다.

+1

이 접근법에서 발견 한 문제는이 접근법을 사용하여 역할이 부족 해지는 것이 쉽다는 것입니다. 당신이 볼 수 있듯이, 6 개의 역할은 2^6 = 64의 가치를 가지며, 31 개의 역할은 2^31 = 2,147,483,647이며, 이는 최대 int 값입니다. 따라서 T-SQL에서 사용할 수있는 가장 큰 데이터 유형은 bigint입니다 (2^63). 물론 varchar 유형을 사용할 수 있지만 많은 역할을 할 때 John Downey의 솔루션을 사용하는 것을 선호합니다. –

10

일반적으로 권한 시스템을 코딩하는 방법은 6 개의 테이블이 있습니다.

  • 사용자 - 이것은 당신의 전형적인 사용자 테이블
  • 그룹입니다 앞으로 꽤 직선 -이 당신의 부서에
  • 역할 동의어가 될 것입니다 - 이것은 일반적으로 사람이 읽을 수있는 이름을 포함한 모든 권한이있는 테이블 및 설명
  • Users_have_Groups - 이것은 사용자가
  • Users_have_Roles에 소속 된 그룹의 다 대다 테이블 - 역할을 개별 사용자에게 할당 된 어떤 다른 대다 테이블
  • Groups_have_Roles - 각 그룹은 당신이 그들이 할당 한 모든 역할을 꺼내서 몇 가지 로직을 실행하는 것 사용자 세션의 시작 부분에서

을 무슨 역할의 최종 대다 테이블, 디렉토리 또는 그룹을 통해 하나 . 그런 다음 해당 역할에 대해 보안 권한으로 코딩합니다.

내가 말했듯이 이것은 내가 일반적으로하는 일이지만 당신의 깍지는 다를 수 있습니다.

0

다양한 응용 프로그램에서 사용한 접근법은 가변적 인 Value 속성을 가진 일반 PermissionToken 클래스를 갖는 것입니다. 그런 다음 요청한 응용 프로그램에 쿼리하면 사용하기 위해 필요한 PermissionTokens가 알려줍니다.때문에 사용자 정의 Value 속성, 응용 프로그램, 모듈 또는 위젯의,

new PermissionToken() 
{ 
    Target = PermissionTokenTarget.Application, 
    Action = PermissionTokenAction.View, 
    Value = "ShippingApp" 
}; 

이 분명히 등을 생성, 수정, 삭제하도록 확장 할 수 :

예를 들어, 배송 응용 프로그램은 필요를 알 수 있습니다 자체적으로 필요한 권한을 정의 할 수 있습니다. YMMV, 그러나 이것은 내가 항상 잘 확장 할 수있는 효율적인 방법이었습니다.

2

John Downey 및 jdecuyper의 솔루션 외에도 비트 필드의 끝/처음에 "Explicit Deny"비트를 추가하여 그룹, 역할 멤버십 및 추가 권한을 추가로 수행 할 수 있습니다 명시 적 거부 항목을 기반으로, NTFS 작업과 마찬가지로 권한에 따라 작동합니다.

2

ASP.NET 멤버십/역할 기능은 설명 된 시나리오에서 완벽하게 작동합니다. 자신의 테이블/procs/클래스를 작성하는 것은 훌륭한 연습이며 분에 대한 세부 사항을 아주 잘 제어 할 수는 있지만이 작업을 수행 한 후에는 .NET에 내장 된 것을 사용하는 것이 낫다는 결론을 얻었습니다. 기존의 많은 코드가 잘 돌아가며 잘 작동하도록 설계되었습니다. 처음부터 글쓰기는 2 주 정도 걸렸지 만 닷넷만큼 견고했다. 당신은 너무 많은 쓰레기 (암호 복구, 자동 잠금, 암호화, 역할, 권한 인터페이스, procs 톤 등)을 코딩해야하고 시간은 다른 곳에서 더 잘 보낼 수 있습니다.

죄송합니다. 귀하의 질문에 답변하지 않은 경우, 누군가가 VB 질문을 할 때 C#을 배우라고 말하는 사람과 같습니다.