2014-04-29 9 views
1

클라이언트가 필요로하는 응용 프로그램을 개발 중이며 매우 유연한 사용자 권한 시스템 인을 개발 중입니다. 예를 들어 사용자는 양식 A에서는 업데이트 권한을 가질 수 있어야하지만 양식 B에서는 업데이트 권한을 가질 수 없어야합니다 (이로 인해 광범위한 업데이트 권한을 정의 할 수 없음). 또한 관리자는 특정 권한을 사용자에게 양도 할 수 있어야합니다.유연한 사용자에게 권한 부여/수정 권한 시스템 부여

나는 CanExecute 방법으로 Command Pattern을 사용할 생각 이었지만 어떻게 동적/특수한 방법으로 사용할 수 있을지 잘 모르겠다. 어떤 제안?

답변

1

내 응용 프로그램에서 비슷한 상황이 발생합니다. 이는 플러그인을 통해 확장 할 수 있으며 플러그인은 자체 권한을 가져올 수 있습니다.

  • /정적 일반적인 PermissionManager
  • 매우 모듈/양식/플러그인 관리자에서 사용 가능한 권한을 등록 할 수있는 "권한 관리자 UI가"가능한 모든 권한을 나열하고을 할 수
  • : 나는 다음과 같은 방법으로 해결 관리자는 사용자에게 할당 현재 사용자가 권한이 있는지 모든 모듈/양식/플러그인 관리자를 요청 액세스에

단순화 된 클래스 구조 :

public class PermissionManager 
{ 
    public static Dictionary<string, IEnumerable<string>> AvailablePermissions { get; set; } 
    public static bool? Can(User user, string permission) 
    { 
     // check DB 
     return DENIED ? false : (ALLOWED ? true : null); 
    } 
} 

public class MyPlugin : IPlugin 
{ 
    public void Init() 
    { 
     PermissionManager.AvailablePermissions["MyPlugin"] = 
      new List<string>() { "Permission1", "Permission2" }; 
    } 

    public void DoWork() 
    { 
     if (PermissionManager.Can(user, "Permission1") != true) 
      throw new NotAllowedException(); 
     // do work 
    } 
} 

이것은 내가 사용하는 기본 패턴입니다. 물론 권한 이름/키에는 상수 또는 유사 항목을 사용해야합니다. 그러면 관리 UI가 구성 UI에서 AvailablePermissions을 반복 할 수 있습니다. DB에

나는 다음 (EF 코드-처음으로) 같은 것을 가지고

public class UserProfilePermissions 
{ 
    public UserProfile User { get; set; } 
    public Permission Permission { get; set; } 
    public bool IsAllowed { get; set; } 
} 
public class Permission 
{ 
    public int Id { get; set; } 
    public string Key { get; set; } 
    public string Group { get; set; } 
} 

그래서 모든 권한 (첫 번째 임무)가 생성 한 Permission 항목이있는 DB의를하고를 통해 매핑 IsAllowed을 사용하여 "ALLOWED"또는 "DENIED"를 정의하는 매핑 테이블.
null 값은 설정되지 않은 권한을 정의하므로 기본값을 사용할 수 있습니다 (=> 권한을 설정하지 않아도 항상 "부인"이라고 말하지는 않음).
매핑 테이블은 또한 예를 들어, 같은 스타일로 사용될 수 있습니다. 역할.

+0

답변 해 주셔서 감사합니다. 매우 훌륭하게 보입니다. DB 측면에서 귀하의 디자인은 어떻습니까? 예를 들어 테이블에있는 해당 모듈의 권한 유형을 수동으로 지정합니까? – Cemre

+0

@Cemre : 기본 스키마가 추가되었습니다. – ChrFin

관련 문제