2014-04-29 76 views
1

我正在開發一個應用程序,其中客戶端需要和極其靈活的用戶權限系統。例如,用戶應該能夠在表單A中擁有更新權限,但不能在表單B中擁有更新權限(這會阻止我定義廣泛的更新權限)。管理員還應該能夠將特定權限轉移給用戶。授予一個超級靈活的用戶訪問/修改權限系統

我正在考慮使用Command PatternCanExecute方法,但並不確定如何以這種動態/特定方式使用它。有什麼建議麼 ?

回答

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 
    } 
} 

這是我使用的基本模式。當然,您應該使用常量或類似的權限名稱/鍵。管理用戶界面可以在配置界面中迭代AvailablePermissions

在DB我有類似如下(EF代碼優先):在DB

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進入和通過映射映射表使用IsAllowed來定義「允許」或「拒絕」。
null值定義了一個未設置的權限,因此可以使用默認值(=>未設置權限並不總是說「DENIED」)。
映射表也可以以相同的樣式用於例如角色。

+0

感謝您的回答,這看起來非常好。你在數據庫方面的設計如何?例如,你是否在表中手動指定該模塊的權限類型? – Cemre

+0

@Cemre:添加了基本模式。 – ChrFin