diff --git a/src/Umbraco.Core/Cache/CacheKeys.cs b/src/Umbraco.Core/Cache/CacheKeys.cs
index 3b9ee9c63a..a4c0cc717f 100644
--- a/src/Umbraco.Core/Cache/CacheKeys.cs
+++ b/src/Umbraco.Core/Cache/CacheKeys.cs
@@ -56,7 +56,7 @@ namespace Umbraco.Core.Cache
[EditorBrowsable(EditorBrowsableState.Never)]
public const string UserCacheKey = "UmbracoUser";
- public const string UserPermissionsCacheKey = "UmbracoUserPermissions";
+ public const string UserGroupPermissionsCacheKey = "UmbracoUserGroupPermissions";
[UmbracoWillObsolete("This cache key is only used for legacy business logic caching, remove in v8")]
public const string ContentTypeCacheKey = "UmbracoContentType";
diff --git a/src/Umbraco.Core/Models/Identity/BackOfficeIdentityUser.cs b/src/Umbraco.Core/Models/Identity/BackOfficeIdentityUser.cs
index 50dc7d06f8..03631bda05 100644
--- a/src/Umbraco.Core/Models/Identity/BackOfficeIdentityUser.cs
+++ b/src/Umbraco.Core/Models/Identity/BackOfficeIdentityUser.cs
@@ -34,10 +34,9 @@ namespace Umbraco.Core.Models.Identity
public int StartContentId { get; set; }
public int StartMediaId { get; set; }
public string[] AllowedSections { get; set; }
+ public string[] Groups { get; set; }
public string Culture { get; set; }
- public string UserTypeAlias { get; set; }
-
///
/// Lockout is always enabled
///
diff --git a/src/Umbraco.Core/Models/Identity/IdentityModelMappings.cs b/src/Umbraco.Core/Models/Identity/IdentityModelMappings.cs
index fab34e5f17..56e3c995be 100644
--- a/src/Umbraco.Core/Models/Identity/IdentityModelMappings.cs
+++ b/src/Umbraco.Core/Models/Identity/IdentityModelMappings.cs
@@ -23,16 +23,16 @@ namespace Umbraco.Core.Models.Identity
.ForMember(user => user.Name, expression => expression.MapFrom(user => user.Name))
.ForMember(user => user.StartMediaId, expression => expression.MapFrom(user => user.StartMediaId))
.ForMember(user => user.StartContentId, expression => expression.MapFrom(user => user.StartContentId))
- .ForMember(user => user.UserTypeAlias, expression => expression.MapFrom(user => user.UserType.Alias))
.ForMember(user => user.AccessFailedCount, expression => expression.MapFrom(user => user.FailedPasswordAttempts))
+ .ForMember(user => user.Groups, expression => expression.MapFrom(user => user.Groups.Select(x => x.Name).ToArray()))
.ForMember(user => user.AllowedSections, expression => expression.MapFrom(user => user.AllowedSections.ToArray()));
config.CreateMap()
.ConstructUsing((BackOfficeIdentityUser user) => new UserData(Guid.NewGuid().ToString("N"))) //this is the 'session id'
.ForMember(detail => detail.Id, opt => opt.MapFrom(user => user.Id))
.ForMember(detail => detail.AllowedApplications, opt => opt.MapFrom(user => user.AllowedSections))
+ .ForMember(detail => detail.Roles, opt => opt.MapFrom(user => user.Groups))
.ForMember(detail => detail.RealName, opt => opt.MapFrom(user => user.Name))
- .ForMember(detail => detail.Roles, opt => opt.MapFrom(user => new[] { user.UserTypeAlias }))
.ForMember(detail => detail.StartContentNode, opt => opt.MapFrom(user => user.StartContentId))
.ForMember(detail => detail.StartMediaNode, opt => opt.MapFrom(user => user.StartMediaId))
.ForMember(detail => detail.Username, opt => opt.MapFrom(user => user.UserName))
diff --git a/src/Umbraco.Core/Models/Membership/EntityPermission.cs b/src/Umbraco.Core/Models/Membership/EntityPermission.cs
index 7ab1ddc817..90430e26a8 100644
--- a/src/Umbraco.Core/Models/Membership/EntityPermission.cs
+++ b/src/Umbraco.Core/Models/Membership/EntityPermission.cs
@@ -1,26 +1,38 @@
-using System.Collections;
+using System.Linq;
namespace Umbraco.Core.Models.Membership
{
///
- /// Represents a user -> entity permission
+ /// Represents an entity permission (defined on the user group and derived to retrieve permissions for a given user)
///
public class EntityPermission
{
- public EntityPermission(int userId, int entityId, string[] assignedPermissions)
+ public EntityPermission(int entityId, string[] assignedPermissions)
{
- UserId = userId;
EntityId = entityId;
AssignedPermissions = assignedPermissions;
}
- public int UserId { get; private set; }
public int EntityId { get; private set; }
///
/// The assigned permissions for the user/entity combo
///
public string[] AssignedPermissions { get; private set; }
+
+ ///
+ /// Adds additional permissions to an existing instance of
+ /// ensuring that only ones that aren't already assigned are added
+ ///
+ ///
+ public void AddAdditionalPermissions(string[] additionalPermissions)
+ {
+ var newPermissions = AssignedPermissions.ToList();
+ newPermissions.AddRange(additionalPermissions);
+ AssignedPermissions = newPermissions
+ .Distinct()
+ .ToArray();
+ }
}
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Models/Membership/EntityPermissionSet.cs b/src/Umbraco.Core/Models/Membership/EntityPermissionSet.cs
index c4669caf59..ea1e927a59 100644
--- a/src/Umbraco.Core/Models/Membership/EntityPermissionSet.cs
+++ b/src/Umbraco.Core/Models/Membership/EntityPermissionSet.cs
@@ -13,30 +13,31 @@ namespace Umbraco.Core.Models.Membership
public int EntityId { get; private set; }
///
- /// The key/value pairs of user id & single permission
+ /// The key/value pairs of user group id & single permission
///
- public IEnumerable UserPermissionsSet { get; private set; }
+ public IEnumerable PermissionsSet { get; private set; }
- public EntityPermissionSet(int entityId, IEnumerable userPermissionsSet)
+ public EntityPermissionSet(int entityId, IEnumerable permissionsSet)
{
EntityId = entityId;
- UserPermissionsSet = userPermissionsSet;
+ PermissionsSet = permissionsSet;
}
- public class UserPermission
+ public class UserGroupPermission
{
- public UserPermission(int userId, string permission)
+ public UserGroupPermission(int groupId, string permission)
{
- UserId = userId;
+ UserGroupId = groupId;
Permission = permission;
}
- public int UserId { get; private set; }
+ public int UserGroupId { get; private set; }
+
public string Permission { get; private set; }
- protected bool Equals(UserPermission other)
+ protected bool Equals(UserGroupPermission other)
{
- return UserId == other.UserId && string.Equals(Permission, other.Permission);
+ return UserGroupId == other.UserGroupId && string.Equals(Permission, other.Permission);
}
public override bool Equals(object obj)
@@ -44,14 +45,14 @@ namespace Umbraco.Core.Models.Membership
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
- return Equals((UserPermission) obj);
+ return Equals((UserGroupPermission) obj);
}
public override int GetHashCode()
{
unchecked
{
- return (UserId*397) ^ Permission.GetHashCode();
+ return (UserGroupId * 397) ^ Permission.GetHashCode();
}
}
}
diff --git a/src/Umbraco.Core/Models/Membership/IUser.cs b/src/Umbraco.Core/Models/Membership/IUser.cs
index f1f9c23971..171a9f0c99 100644
--- a/src/Umbraco.Core/Models/Membership/IUser.cs
+++ b/src/Umbraco.Core/Models/Membership/IUser.cs
@@ -1,6 +1,5 @@
using System.Collections.Generic;
using Umbraco.Core.Models.EntityBase;
-using Umbraco.Core.Persistence.Mappers;
namespace Umbraco.Core.Models.Membership
{
@@ -15,24 +14,24 @@ namespace Umbraco.Core.Models.Membership
int StartContentId { get; set; }
int StartMediaId { get; set; }
string Language { get; set; }
-
- ///
- /// Gets/sets the user type for the user
- ///
- IUserType UserType { get; set; }
- //TODO: This should be a private set
///
- /// The default permission set for the user
+ /// Gets the groups that user is part of
///
- ///
- /// Currently in umbraco each permission is a single char but with an Enumerable{string} collection this allows for flexible changes to this in the future
- ///
- IEnumerable DefaultPermissions { get; set; }
+ IEnumerable Groups { get; }
+
+ ///
+ /// Indicates if the groups for a user have been loaded
+ ///
+ bool GroupsLoaded { get; }
+
+ void RemoveGroup(IUserGroup group);
+
+ void AddGroup(IUserGroup group);
+
+ void SetGroupsLoaded();
IEnumerable AllowedSections { get; }
- void RemoveAllowedSection(string sectionAlias);
- void AddAllowedSection(string sectionAlias);
///
/// Exposes the basic profile data
diff --git a/src/Umbraco.Core/Models/Membership/IUserType.cs b/src/Umbraco.Core/Models/Membership/IUserGroup.cs
similarity index 64%
rename from src/Umbraco.Core/Models/Membership/IUserType.cs
rename to src/Umbraco.Core/Models/Membership/IUserGroup.cs
index fe678afd2b..336caa4c47 100644
--- a/src/Umbraco.Core/Models/Membership/IUserType.cs
+++ b/src/Umbraco.Core/Models/Membership/IUserGroup.cs
@@ -1,28 +1,34 @@
-using System.Collections.Generic;
-using Umbraco.Core.Models.EntityBase;
-using Umbraco.Core.Persistence.Mappers;
-
-namespace Umbraco.Core.Models.Membership
-{
-
- public interface IUserType : IAggregateRoot
- {
- ///
- /// The user type alias
- ///
- string Alias { get; set; }
-
- ///
- /// The user type name
- ///
- string Name { get; set; }
-
- ///
- /// The set of default permissions for the user type
- ///
- ///
- /// By default each permission is simply a single char but we've made this an enumerable{string} to support a more flexible permissions structure in the future.
- ///
- IEnumerable Permissions { get; set; }
- }
+using System.Collections.Generic;
+using Umbraco.Core.Models.EntityBase;
+
+namespace Umbraco.Core.Models.Membership
+{
+ public interface IUserGroup : IAggregateRoot
+ {
+ ///
+ /// The alias
+ ///
+ string Alias { get; set; }
+
+ ///
+ /// The name
+ ///
+ string Name { get; set; }
+
+ ///
+ /// The set of default permissions
+ ///
+ ///
+ /// By default each permission is simply a single char but we've made this an enumerable{string} to support a more flexible permissions structure in the future.
+ ///
+ IEnumerable Permissions { get; set; }
+
+ IEnumerable AllowedSections { get; }
+
+ void RemoveAllowedSection(string sectionAlias);
+
+ void AddAllowedSection(string sectionAlias);
+
+ void ClearAllowedSections();
+ }
}
\ No newline at end of file
diff --git a/src/Umbraco.Core/Models/Membership/UmbracoMembershipUser.cs b/src/Umbraco.Core/Models/Membership/UmbracoMembershipUser.cs
index ada2a7102d..0ada5c3d0e 100644
--- a/src/Umbraco.Core/Models/Membership/UmbracoMembershipUser.cs
+++ b/src/Umbraco.Core/Models/Membership/UmbracoMembershipUser.cs
@@ -34,12 +34,11 @@ namespace Umbraco.Core.Models.Membership
/// The last lockout date.
/// The full name.
/// The language.
- /// Type of the user.
///
public UmbracoMembershipUser(string providerName, string name, object providerUserKey, string email,
string passwordQuestion, string comment, bool isApproved, bool isLockedOut,
DateTime creationDate, DateTime lastLoginDate, DateTime lastActivityDate, DateTime lastPasswordChangedDate,
- DateTime lastLockoutDate, string fullName, string language, IUserType userType, T user)
+ DateTime lastLockoutDate, string fullName, string language, T user)
: base( providerName, name, providerUserKey, email, passwordQuestion, comment, isApproved, isLockedOut,
creationDate, lastLoginDate, lastActivityDate, lastPasswordChangedDate, lastLockoutDate)
{
diff --git a/src/Umbraco.Core/Models/Membership/User.cs b/src/Umbraco.Core/Models/Membership/User.cs
index cadda14508..8dd1f31654 100644
--- a/src/Umbraco.Core/Models/Membership/User.cs
+++ b/src/Umbraco.Core/Models/Membership/User.cs
@@ -8,7 +8,6 @@ using System.Runtime.Serialization;
using Umbraco.Core.Configuration;
using Umbraco.Core.Models.EntityBase;
-
namespace Umbraco.Core.Models.Membership
{
///
@@ -18,19 +17,11 @@ namespace Umbraco.Core.Models.Membership
[DataContract(IsReference = true)]
public class User : Entity, IUser
{
- public User(IUserType userType)
+ public User()
{
- if (userType == null) throw new ArgumentNullException("userType");
-
- _userType = userType;
- _defaultPermissions = _userType.Permissions == null ? Enumerable.Empty() : new List(_userType.Permissions);
- //Groups = new List