0
我有一个自定义产品类型,显示在自定义列表Web部件中。由于性能方面的原因,我试图缓存项目,但检查用户权限也很重要,因为并非所有用户都能看到所有产品。加载Kentico 10网络节点的最佳方法,包括缓存和权限检查
private static IList<TreeNode> GetUniqueProducts(string clientId, string path)
{
var pages = CacheHelper.Cache(cs => GetProducts(cs, path), new CacheSettings(10, "cus|" + clientId));
return GetUniqueProductNamesItems(pages);
}
private static IList<TreeNode> GetProducts(CacheSettings cacheSettings, string rootPath)
{
var pages = DocumentHelper.GetDocuments().Types("CUS.Product")
.Path(rootPath, PathTypeEnum.Children)
.Published().CheckPermissions().ToList();
if (cacheSettings.Cached)
{
cacheSettings.CacheDependency = CacheHelper.GetCacheDependency("nodes|custom|cus.product|all");
}
return pages;
}
但是我意识到这是缓存第一个用户的产品列表。实际上,我想将完整的产品列表存储在缓存中,但在显示之前请检查权限。
检查权限的唯一方法似乎是按照上面的DocumentQuery的一部分 - 但我不知道如何将其应用于缓存的产品列表或单个节点上。
那么有没有一种很好的方法来实现我想要的?无需遍历每个节点并单独检查用户是否有权访问该节点?
我想知道我是否可以缓存产品列表 - 然后再轻松/有效地检查它们的权限。我试图避免每个用户缓存它们 - 因为这看起来不太正确。如果我确实需要查看用户过滤的一组产品列表,那么我无法使用缓存也不太合适。希望更有意义。 – Jen
我添加了部分代码,实际上缓存了我的问题 - 感谢您的建议。 – Jen
最终包含一个用户标识符作为缓存键的一部分 - 并为每个用户进行缓存。尽管它看起来有点奇怪 - 但Kentico指出,即使产品被缓存,它仍然会触及数据库来检查权限! – Jen