2016-10-28 67 views
3

靜態我將像這樣進入我的服務:如何以編程方式分配角色和權限,以服務和/或RequestDTOs

[Authenticate] 
public class AppUserService : Service 
{ 
    [RequiredRole("Administrator")] 
    public object Post(CreateAppUser request) 
    { 
     //..... 
    } 
} 

我怎樣才能做到這一點編程?

我會讓用戶使用GUI創建角色。然後我會列出一些可用的方法,例如通過提供使用類似改進代碼的方法:

 var appHost = HostContext.AppHost; 
     var restPaths = appHost.RestPaths; 
     foreach (var restPath in restPaths) 
     { 
      var reqType = restPath.RequestType; 
      string verbs = string.Empty; 
      if (restPath.Verbs != null) 
      { 
       var counter = 0; 
       foreach (var verb in restPath.Verbs) 
       { 
        if (counter > 0) verbs += ", "; 
        verbs += verb; 
        counter++; 
       } 
      } 
      Debug.WriteLine($"Path: {restPath.Path} | Verbs: {verbs} | Name: {reqType.Name} FullName: {reqType.FullName}"); 
     } 

上面的代碼輸出類似

Path: /appusers | Verbs: POST | Name: CreateAppUser FullName: MyServer.ServiceModel.DTOs.Request.CreateAppUser 

所以,我可以在我的UI顯示RequestTypeName財產,讓他定義是什麼,角色允許調用這個方法。因此,用戶可以創建一個名爲「用戶管理」的角色,並允許該角色的成員執行CreateAppUser

使用註釋我會寫

[RequiredRole("Administrator", "User Management")] 
public object Post(CreateAppUser request) 
{ .... } 

這是無論如何可能在C#代碼?

回答

2

ServiceStack確實有辦法在運行時動態添加屬性,e.g:

typeof(CreateAppUser) 
    .AddAttributes(new RequiredRoleAttribute("Administrator", "User Management")); 

這是靜態聲明屬性的選擇,但它仍然不是一個數據驅動的授權系統的解決方案。

但是你可以在除了ServiceStack內置的屬性,通過在服務確認它添加自己的自定義授權邏輯:

public ICustomAuth CustomAuth { get; set; } 

public object Post(CreateAppUser request) 
{ 
    var session = base.GetSession(); 
    var requiresRoles = CustomAuth.GetRequiredRoles(request.GetType()); 
    var hasAllRoles = requiresRoles.All(r => 
     session.HasRole(r, base.AuthRepository)) 
    if (!hasAllRoles) 
     throw new UnauthorizedAccessException("Requires all roles"); 
} 

如果你這樣做了很多,你會希望重構自定義驗證邏輯轉換爲單個可重用方法,或者您更喜歡自定義的RequestFilter屬性。

+0

謝謝德米斯,我認爲自定義的RequestFilter是最好的方法。我會稍後再試。 – ThommyB

相關問題