#19477: Refactoring navigation manager for performance.

Items with no permissions explicitly set should not undergo authorization checking.
Returning the same item instead of creating a copy
Folded part of Reduce method into LINQ query.

Work Item: 19477

--HG--
branch : 1.x
This commit is contained in:
Piotr Szmyd
2013-02-22 02:43:55 +01:00
parent 09f8c56377
commit ec3ca6738e
2 changed files with 13 additions and 31 deletions

View File

@@ -42,9 +42,9 @@ namespace Orchard.Core.Navigation.Services {
}
if (part.Is<MenuItemPart>())
builder.Add(new LocalizedString(HttpUtility.HtmlEncode(part.MenuText)), part.MenuPosition, item => item.Url(part.As<MenuItemPart>().Url).Content(part).Culture(culture));
builder.Add(new LocalizedString(HttpUtility.HtmlEncode(part.MenuText)), part.MenuPosition, item => item.Url(part.As<MenuItemPart>().Url).Content(part).Culture(culture).Permission(Contents.Permissions.ViewContent));
else
builder.Add(new LocalizedString(HttpUtility.HtmlEncode(part.MenuText)), part.MenuPosition, item => item.Action(_contentManager.GetItemMetadata(part.ContentItem).DisplayRouteValues).Content(part).Culture(culture));
builder.Add(new LocalizedString(HttpUtility.HtmlEncode(part.MenuText)), part.MenuPosition, item => item.Action(_contentManager.GetItemMetadata(part.ContentItem).DisplayRouteValues).Content(part).Culture(culture).Permission(Contents.Permissions.ViewContent));
}
}
}

View File

@@ -99,35 +99,17 @@ namespace Orchard.Core.Navigation.Services {
/// Updates the items by checking for permissions
/// </summary>
private IEnumerable<MenuItem> Reduce(IEnumerable<MenuItem> items, bool isAdminMenu) {
var hasDebugShowAllMenuItems = _authorizationService.TryCheckAccess(Permission.Named("DebugShowAllMenuItems"), _orchardServices.WorkContext.CurrentUser, null);
foreach (var item in items) {
if (
// debug flag is on
hasDebugShowAllMenuItems ||
// a content item is linked and the user can view it
item.Content != null && item.Permissions.Concat(new[] { Contents.Permissions.ViewContent }).Any(x => _authorizationService.TryCheckAccess(x, _orchardServices.WorkContext.CurrentUser, item.Content)) ||
// it's the admin menu and permissions are effective
isAdminMenu && (!item.Permissions.Any() || item.Permissions.Any(x => _authorizationService.TryCheckAccess(x, _orchardServices.WorkContext.CurrentUser, null))) ) {
yield return new MenuItem {
Items = Reduce(item.Items, isAdminMenu),
Permissions = item.Permissions,
Position = item.Position,
RouteValues = item.RouteValues,
LocalNav = item.LocalNav,
Culture = item.Culture,
Text = item.Text,
IdHint = item.IdHint,
Classes = item.Classes,
Url = item.Url,
LinkToFirstChild = item.LinkToFirstChild,
Href = item.Href,
Content = item.Content
};
}
foreach (var item in items.Where(item =>
!item.Permissions.Any() ||
// debug flag is on
_authorizationService.TryCheckAccess(Permission.Named("DebugShowAllMenuItems"), _orchardServices.WorkContext.CurrentUser, null) ||
// a content item is linked and the user can view it
(item.Content != null && item.Permissions.Any(x => _authorizationService.TryCheckAccess(x, _orchardServices.WorkContext.CurrentUser, item.Content)) ||
// it's the admin menu and permissions are effective
isAdminMenu && item.Permissions.Any(x => _authorizationService.TryCheckAccess(x, _orchardServices.WorkContext.CurrentUser, null)))))
{
item.Items = Reduce(item.Items, isAdminMenu);
yield return item;
}
}