2015-12-08 197 views
2

我試圖檢查給定的用戶是否有權訪問特定的自定義表。 基礎上kentico文件上列出的check permissions for a custom table例如,我已經建立了類似的呼籲,用我的自定義表類名和用戶信息,但呼叫「UserInfoProvider.IsAuthorizedPerClass」總是返回false:Kentico UserInfoProvider.IsAuthorizedPerClass不按預期方式工作

private bool CheckCustomTableReadPermission(UserInfo user = null) 
{ 
    // Gets the user object 
    //UserInfo user = UserInfoProvider.GetUserInfo("CMSEditor"); 
    //UserInfo user = UserInfoProvider.GetUserInfo("someothervalidusername"); 
    //UserInfo user = CurrentUser; 

    //normally outside of this function 
    UserInfo CurrentUser = MembershipContext.AuthenticatedUser; 
    string CustomTableClassName = "Namespc.TblName"; 

    if (user == null) 
    { 
     user = CurrentUser; 
    } 

    if (user != null) 
    { 
     // Checks whether the user has the Read permission for the CMS.MenuItem page type 
     if (UserInfoProvider.IsAuthorizedPerClass(CustomTableClassName, "Read", SiteContext.CurrentSiteName, user)) 
     { 
      // Perform an action according to the result 
      return true; 
     } 
    } 

    return false; 
} 

燦除了「閱讀」之外,任何人都會提及有效的權限名稱字符串是什麼? (例如:「修改」?「刪除」?「插入」?)

是否UserInfoProvider.IsAuthorizedPerClass解決給定用戶的所有成員,或者它只是檢查用戶是否明確地添加到自定義表?

有什麼建議嗎?我們正在使用Kentico v8.2.25

謝謝!

維克多

回答

2

什麼做同樣的方式,因爲它在

CMS \ CMSModules \ CustomTables \工具的完成\ CustomTable_Data_EditItem.aspx.cs

是:

DataClassInfo dci = DataClassInfoProvider.GetDataClassInfo(customTableId); 
dci.CheckPermissions(PermissionsEnum.Read, SiteContext.CurrentSiteName, MembershipContext.AuthenticatedUser) 

和可能的權限位於CMS.DataEngine.PermissionsEnum。 (閱讀,修改,創建,刪除,銷燬)

+1

謝謝,Rocky!這比我們開始走的道路更好。 我們實際上將通過類名獲取CustomTable,然後在自定義表對象上調用CheckPermissions。這更符合我們最初想要(預期)如何處理這些數據。 –

1

編輯:

我,啞。您正在爲用戶參數分配默認值,而不是自動分配的值。我仍然會檢查以確保您獲得您期望的用戶信息,因爲這似乎是導致此問題的最可能原因。

你似乎遇到了一個問題就在這裏:

private bool CheckCustomTableReadPermission(UserInfo user = null) 

既然你是自動分配的user參數來當你的方法被調用空,下面的語句將永遠是正確的:

if (user == null) 
{ 
    user = CurrentUser; 
} 

而且你永遠達不到你的另一說法:

if (user != null) 
{ 
    // Checks whether the user has the Read permission for the CMS.MenuItem page type 
    if (UserInfoProvider.IsAuthorizedPerClass(CustomTableClassName, "Read", SiteContext.CurrentSiteName, user)) 
    { 
     // Perform an action according to the result 
     return true; 
    } 
} 

所以你的方法總會返回false。

IsAuthorizedPerClass()函數僅檢查用戶對您提供檢查的類的權限,並僅檢查您爲其提供檢查的特定權限(例如「讀取」)。所以是的,它只會查看用戶是否擁有自定義表的讀取權限。

我不是100%確定所有的權限是什麼,雖然它似乎存儲在枚舉中。我會盡快回復你。希望這會有所幫助:)

+0

您好Jerreck,我也試圖硬編碼用戶名的字符串,並確認我得到正確的用戶信息,並調試時,我得到一個有效的用戶信息。 好像UserInfoProvider.IsAuthorizedPerClass沒有正確評估權限。例如,我正在使用我的用戶名(它應該可以作爲全局管理員訪問)進行檢查,但是UserInfoProvider.IsAuthorizedPerClass的計算結果爲false。請注意,用戶對象本身沒有顯式權限,但是通過角色 - 我們系統中的所有其他用戶(非管理員)都會遇到這種情況 –

+0

嗯,您是否嘗試過檢查具有正確角色的用戶已經讀取表格的權限而不是具有全局管理權限的權限?這實際上可能是問題 - 我從來沒有用全球管理員用戶進行過測試。該方法應該迭代與用戶關聯的角色並檢查角色的權限。對不起,如果這從我的答案不清楚。 – Jerreck

1

只有當用戶的角色已被授予明確角色的權限內該方法將返回true。所有其他時間,即使用戶實際上能夠讀取/修改/等等,它也將返回錯誤。自定義表。

要得到正確的權限字符串,你可以使用CMS.DataEngine.PermissionsEnum.<type>.ToString()

檢查用戶是否有權限讀取特定的自定義表,則需要進行以下3個檢查順序:

UserInfoProvider.IsAuthorizedPerUIElement("CMS.CustomTables","CustomTables",SiteContext.CurrentSiteName,user) 
UserInfoProvider.IsAuthorizedPerResource("CMS.CustomTables", PermissionsEnum.Read.ToString(), SiteContext.CurrentSiteName, user) 
UserInfoProvider.IsAuthorizedPerClass(CustomTableClassName, PermissionsEnum.Read.ToString(), SiteContext.CurrentSiteName, user) 
+0

好像我需要「或」最後2個電話,以確保給定的用戶有權訪問自定義表。如果我按順序調用它們,那麼它將失敗,因爲最後一次檢查是查看用戶/角色是否已在表格中明確設置。在我看來,像IsAuthorizedPerClass方法發生故障,而實際上應該做這樣的評價: UserInfoProvider.IsAuthorizedPerResource( 「CMS.CustomTables」,PermissionsEnum.Read.ToString(),SiteContext.CurrentSiteName,用戶) UserInfoProvider.IsAuthorizedPerClass (CustomTableClassName,PermissionsEnum.Read.ToString(),SiteContext.CurrentSiteName,user) –