diff --git a/src/Umbraco.Core/Models/Membership/EntityPermissionCollection.cs b/src/Umbraco.Core/Models/Membership/EntityPermissionCollection.cs
index 5fca079cfc..b8e198bb83 100644
--- a/src/Umbraco.Core/Models/Membership/EntityPermissionCollection.cs
+++ b/src/Umbraco.Core/Models/Membership/EntityPermissionCollection.cs
@@ -17,7 +17,30 @@ namespace Umbraco.Core.Models.Membership
}
///
- /// Returns the aggregate permissions in the permission set
+ /// Returns the aggregate permissions in the permission set for a single node
+ ///
+ ///
+ ///
+ /// This value is only calculated once per node
+ ///
+ public IEnumerable GetAllPermissions(int entityId)
+ {
+ if (_aggregateNodePermissions == null)
+ _aggregateNodePermissions = new Dictionary();
+
+ string[] entityPermissions;
+ if (_aggregateNodePermissions.TryGetValue(entityId, out entityPermissions) == false)
+ {
+ entityPermissions = this.Where(x => x.EntityId == entityId).SelectMany(x => x.AssignedPermissions).Distinct().ToArray();
+ _aggregateNodePermissions[entityId] = entityPermissions;
+ }
+ return entityPermissions;
+ }
+
+ private Dictionary _aggregateNodePermissions;
+
+ ///
+ /// Returns the aggregate permissions in the permission set for all nodes
///
///
///
diff --git a/src/Umbraco.Web/WebApi/Filters/FilterAllowedOutgoingContentAttribute.cs b/src/Umbraco.Web/WebApi/Filters/FilterAllowedOutgoingContentAttribute.cs
index 331839780a..808d7c6da1 100644
--- a/src/Umbraco.Web/WebApi/Filters/FilterAllowedOutgoingContentAttribute.cs
+++ b/src/Umbraco.Web/WebApi/Filters/FilterAllowedOutgoingContentAttribute.cs
@@ -101,30 +101,19 @@ namespace Umbraco.Web.WebApi.Filters
ids.Add(((dynamic)items[i]).Id);
}
//get all the permissions for these nodes in one call
- var permissions = _userService.GetPermissions(user, ids.ToArray()).ToArray();
+ var permissions = _userService.GetPermissions(user, ids.ToArray());
var toRemove = new List();
foreach (dynamic item in items)
- {
- var nodePermission = permissions.Where(x => x.EntityId == Convert.ToInt32(item.Id)).ToArray();
- //if there are no permissions for this id then we need to check what the user's default
- // permissions are.
- if (nodePermission.Length == 0)
+ {
+ //get the combined permission set across all user groups for this node
+ //we're in the world of dynamics here so we need to cast
+ var nodePermission = ((IEnumerable)permissions.GetAllPermissions(item.Id)).ToArray();
+
+ //if the permission being checked doesn't exist then remove the item
+ if (nodePermission.Contains(_permissionToCheck.ToString(CultureInfo.InvariantCulture)) == false)
{
- //var defaultP = user.DefaultPermissions
-
toRemove.Add(item);
- }
- else
- {
- foreach (var n in nodePermission)
- {
- //if the permission being checked doesn't exist then remove the item
- if (n.AssignedPermissions.Contains(_permissionToCheck.ToString(CultureInfo.InvariantCulture)) == false)
- {
- toRemove.Add(item);
- }
- }
- }
+ }
}
foreach (var item in toRemove)
{