2015-12-08 190 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) –