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

StackOverflow https://stackoverflow.com/questions/1451

  •  08-06-2019
  •  | 
  •  

문제

다양한 유형의 권한을 제공해야 하는 다음과 같은 시나리오에 자주 직면합니다.저는 주로 SQL Server 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 q.SectionID=@SectionID
      AND (emp.UserID=@UserID OR dept.DeptID=@DeptID OR
     (emp.UserID IS NULL AND dept.DeptID IS NULL)) AND ApplicationID = 1
    ORDER BY q.QID ASC
    

내 생각

예제가 의미가 있기를 바랍니다.나는 그것들을 함께 엮었습니다.

첫 번째 예는 작업이 덜 필요하지만 둘 다 최선의 답이라고 느껴지지는 않습니다.이 문제를 처리하는 더 좋은 방법이 있나요?

도움이 되었습니까?

해결책

나는 존 다우니의 말에 동의한다.

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

다른 팁

제가 일반적으로 코딩 권한 시스템을 사용하는 방식은 6개의 테이블을 갖는 것입니다.

  • 사용자 - 이것은 매우 간단하며 일반적인 사용자 테이블입니다.
  • 그룹 - 이는 귀하의 부서와 동의어입니다.
  • 역할 - 일반적으로 사람이 읽을 수 있는 이름과 설명을 포함하여 모든 권한이 포함된 테이블입니다.
  • Users_have_Groups - 사용자가 속한 그룹에 대한 다대다 테이블입니다.
  • Users_have_Roles - 개별 사용자에게 할당된 역할에 대한 또 다른 다대다 테이블
  • Groups_have_Roles - 각 그룹의 역할에 대한 최종 다대다 테이블

사용자 세션이 시작될 때 디렉터리나 그룹을 통해 할당된 모든 역할을 가져오는 일부 논리를 실행합니다.그런 다음 해당 역할에 대해 보안 권한으로 코딩합니다.

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

John Downey 및 jdecuyper의 솔루션 외에도 비트 필드의 끝/시작 부분에 "명시적 거부" 비트를 추가하여 그룹, 역할 멤버십별로 추가 권한을 수행한 다음 명시적 거부를 기반으로 권한을 뺄 수 있습니다. NTFS와 마찬가지로 권한 측면에서 작동하는 항목입니다.

솔직히 말해서 ASP.NET 멤버십/역할 기능은 귀하가 설명한 시나리오에 완벽하게 작동합니다.자신만의 테이블/프로세스/클래스를 작성하는 것은 훌륭한 연습이며 미세한 세부 사항을 아주 훌륭하게 제어할 수 있지만 직접 이 작업을 수행한 후에는 내장된 .NET 항목을 사용하는 것이 더 낫다는 결론을 내렸습니다.많은 기존 코드가 이 문제를 해결하도록 설계되어 있어 매우 좋습니다.처음부터 작성하는 데 약 2주가 걸렸으며 .NET만큼 강력하지는 않았습니다.너무 많은 쓰레기(비밀번호 복구, 자동 잠금, 암호화, 역할, 권한 인터페이스, 수많은 프로세스 등)를 코딩해야 하며 시간을 다른 곳에서 보내는 것이 더 나을 수 있습니다.

귀하의 질문에 대답하지 못했다면 죄송합니다. 저는 누군가 VB 질문을 할 때 C#을 배우라고 말하는 사람과 같습니다.

다양한 애플리케이션에서 내가 사용한 접근 방식은 변경 가능한 Value 속성이 있는 일반 PermissionToken 클래스를 사용하는 것입니다.그런 다음 요청한 애플리케이션을 쿼리하면 이를 사용하기 위해 필요한 PermissionToken이 무엇인지 알려줍니다.

예를 들어 Shipping 애플리케이션은 다음이 필요하다고 말할 수 있습니다.

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

이는 분명히 생성, 편집, 삭제 등으로 확장될 수 있으며 사용자 정의 값 속성으로 인해 모든 애플리케이션, 모듈 또는 위젯이 자체 필수 권한을 정의할 수 있습니다.YMMV, 그러나 이것은 확장성이 뛰어나다는 것을 알게 된 나에게 항상 효율적인 방법이었습니다.

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