Skip to content

Commit 0c5fb0e

Browse files
Create system roles by default (OrchardCMS#17341)
Co-authored-by: Mike Alhayek <mike@crestapps.com>
1 parent 472378b commit 0c5fb0e

File tree

26 files changed

+319
-265
lines changed

26 files changed

+319
-265
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using Microsoft.AspNetCore.Identity;
2+
using Microsoft.Extensions.Logging;
3+
using OrchardCore.Data.Migration;
4+
using OrchardCore.Security;
5+
6+
namespace OrchardCore.Roles.Migrations;
7+
8+
public sealed class SystemRolesMigrations : DataMigration
9+
{
10+
private readonly ISystemRoleProvider _systemRoleProvider;
11+
private readonly RoleManager<IRole> _roleManager;
12+
private readonly ILogger _logger;
13+
14+
public SystemRolesMigrations(
15+
ISystemRoleProvider systemRoleProvider,
16+
RoleManager<IRole> roleManager,
17+
ILogger<RolesMigrations> logger)
18+
{
19+
_systemRoleProvider = systemRoleProvider;
20+
_roleManager = roleManager;
21+
_logger = logger;
22+
}
23+
24+
public async Task<int> CreateAsync()
25+
{
26+
var systemRoles = _systemRoleProvider.GetSystemRoles();
27+
28+
foreach (var systemRole in systemRoles)
29+
{
30+
if (!await _roleManager.RoleExistsAsync(systemRole.RoleName))
31+
{
32+
await _roleManager.CreateAsync(systemRole);
33+
}
34+
}
35+
36+
_logger.LogInformation("The system roles have been created successfully.");
37+
38+
return 1;
39+
}
40+
}

src/OrchardCore.Modules/OrchardCore.Roles/Recipes/RolesStep.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,15 @@ namespace OrchardCore.Roles.Recipes;
1313
public sealed class RolesStep : NamedRecipeStepHandler
1414
{
1515
private readonly RoleManager<IRole> _roleManager;
16-
private readonly ISystemRoleNameProvider _systemRoleNameProvider;
16+
private readonly ISystemRoleProvider _systemRoleProvider;
1717

1818
public RolesStep(
1919
RoleManager<IRole> roleManager,
20-
ISystemRoleNameProvider systemRoleNameProvider)
20+
ISystemRoleProvider systemRoleProvider)
2121
: base("Roles")
2222
{
2323
_roleManager = roleManager;
24-
_systemRoleNameProvider = systemRoleNameProvider;
24+
_systemRoleProvider = systemRoleProvider;
2525
}
2626

2727
protected override async Task HandleAsync(RecipeExecutionContext context)
@@ -59,7 +59,7 @@ protected override async Task HandleAsync(RecipeExecutionContext context)
5959
r.RoleClaims.RemoveAll(c => c.ClaimType == Permission.ClaimType);
6060
}
6161

62-
if (!await _systemRoleNameProvider.IsAdminRoleAsync(roleName))
62+
if (!_systemRoleProvider.IsAdminRole(roleName))
6363
{
6464
if (roleEntry.PermissionBehavior == PermissionBehavior.Remove)
6565
{

src/OrchardCore.Modules/OrchardCore.Roles/Services/RoleClaimsProvider.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,18 @@ public class RoleClaimsProvider : IUserClaimsProvider
1111
{
1212
private readonly UserManager<IUser> _userManager;
1313
private readonly RoleManager<IRole> _roleManager;
14-
private readonly ISystemRoleNameProvider _systemRoleNameProvider;
14+
private readonly ISystemRoleProvider _systemRoleProvider;
1515
private readonly IdentityOptions _identityOptions;
1616

1717
public RoleClaimsProvider(
1818
UserManager<IUser> userManager,
1919
RoleManager<IRole> roleManager,
20-
ISystemRoleNameProvider systemRoleNameProvider,
20+
ISystemRoleProvider systemRoleProvider,
2121
IOptions<IdentityOptions> identityOptions)
2222
{
2323
_userManager = userManager;
2424
_roleManager = roleManager;
25-
_systemRoleNameProvider = systemRoleNameProvider;
25+
_systemRoleProvider = systemRoleProvider;
2626
_identityOptions = identityOptions.Value;
2727
}
2828

@@ -39,7 +39,7 @@ public async Task GenerateAsync(IUser user, ClaimsIdentity claims)
3939

4040
foreach (var roleName in roleNames)
4141
{
42-
if (await _systemRoleNameProvider.IsAdminRoleAsync(roleName))
42+
if (_systemRoleProvider.IsAdminRole(roleName))
4343
{
4444
isAdministrator = true;
4545
break;

src/OrchardCore.Modules/OrchardCore.Roles/Services/RoleStore.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,17 @@ namespace OrchardCore.Roles.Services;
1313
public class RoleStore : IRoleClaimStore<IRole>, IQueryableRoleStore<IRole>
1414
{
1515
private readonly IServiceProvider _serviceProvider;
16-
private readonly ISystemRoleNameProvider _systemRoleProvider;
16+
private readonly ISystemRoleProvider _systemRoleProvider;
1717
private readonly IDocumentManager<RolesDocument> _documentManager;
18-
protected readonly IStringLocalizer S;
1918
private readonly ILogger _logger;
2019

20+
protected readonly IStringLocalizer S;
21+
2122
private bool _updating;
2223

2324
public RoleStore(
2425
IServiceProvider serviceProvider,
25-
ISystemRoleNameProvider systemRoleProvider,
26+
ISystemRoleProvider systemRoleProvider,
2627
IDocumentManager<RolesDocument> documentManager,
2728
IStringLocalizer<RoleStore> stringLocalizer,
2829
ILogger<RoleStore> logger)
@@ -91,7 +92,7 @@ public async Task<IdentityResult> DeleteAsync(IRole role, CancellationToken canc
9192
});
9293
}
9394

94-
if (await _systemRoleProvider.IsSystemRoleAsync(roleToRemove.RoleName))
95+
if (_systemRoleProvider.IsSystemRole(roleToRemove.RoleName))
9596
{
9697
return IdentityResult.Failed(new IdentityError
9798
{

src/OrchardCore.Modules/OrchardCore.Roles/Services/RoleUpdater.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public class RoleUpdater : FeatureEventHandler, IRoleCreatedEventHandler, IRoleR
1515
private readonly ShellDescriptor _shellDescriptor;
1616
private readonly IExtensionManager _extensionManager;
1717
private readonly IDocumentManager<RolesDocument> _documentManager;
18-
private readonly ISystemRoleNameProvider _systemRoleNameProvider;
18+
private readonly ISystemRoleProvider _systemRoleProvider;
1919
private readonly IEnumerable<IPermissionProvider> _permissionProviders;
2020
private readonly ITypeFeatureProvider _typeFeatureProvider;
2121
private readonly ILogger _logger;
@@ -26,15 +26,15 @@ public RoleUpdater(
2626
ShellDescriptor shellDescriptor,
2727
IExtensionManager extensionManager,
2828
IDocumentManager<RolesDocument> documentManager,
29-
ISystemRoleNameProvider systemRoleNameProvider,
29+
ISystemRoleProvider systemRoleProvider,
3030
IEnumerable<IPermissionProvider> permissionProviders,
3131
ITypeFeatureProvider typeFeatureProvider,
3232
ILogger<RoleUpdater> logger)
3333
{
3434
_shellDescriptor = shellDescriptor;
3535
_extensionManager = extensionManager;
3636
_documentManager = documentManager;
37-
_systemRoleNameProvider = systemRoleNameProvider;
37+
_systemRoleProvider = systemRoleProvider;
3838
_permissionProviders = permissionProviders;
3939
_typeFeatureProvider = typeFeatureProvider;
4040
_logger = logger;
@@ -80,7 +80,7 @@ private async Task UpdateRolesForInstalledFeatureAsync(IFeatureInfo feature)
8080
var permissions = (stereotype.Permissions ?? [])
8181
.Select(stereotype => stereotype.Name);
8282

83-
if (await UpdatePermissionsAsync(role, permissions))
83+
if (UpdatePermissions(role, permissions))
8484
{
8585
updated = true;
8686
}
@@ -121,7 +121,7 @@ private async Task UpdateRolesForEnabledFeatureAsync(IFeatureInfo feature)
121121
updated = true;
122122

123123
missingFeatures.Remove(feature.Id);
124-
await UpdateRolesForEnabledFeatureAsync(role, providers);
124+
UpdateRolesForEnabledFeature(role, providers);
125125
}
126126

127127
if (updated)
@@ -166,7 +166,7 @@ private async Task UpdateRoleForInstalledFeaturesAsync(string roleName)
166166
.SelectMany(stereotype => stereotype.Permissions ?? [])
167167
.Select(stereotype => stereotype.Name);
168168

169-
await UpdatePermissionsAsync(role, permissions);
169+
UpdatePermissions(role, permissions);
170170
}
171171

172172
private async Task RemoveRoleForMissingFeaturesAsync(string roleName)
@@ -179,15 +179,15 @@ private async Task RemoveRoleForMissingFeaturesAsync(string roleName)
179179
}
180180
}
181181

182-
private Task<bool> UpdateRolesForEnabledFeatureAsync(Role role, IEnumerable<IPermissionProvider> providers)
182+
private bool UpdateRolesForEnabledFeature(Role role, IEnumerable<IPermissionProvider> providers)
183183
{
184184
var stereotypes = providers
185185
.SelectMany(provider => provider.GetDefaultStereotypes())
186186
.Where(stereotype => string.Equals(stereotype.Name, role.RoleName, StringComparison.OrdinalIgnoreCase));
187187

188188
if (!stereotypes.Any())
189189
{
190-
return Task.FromResult(false);
190+
return false;
191191
}
192192

193193
var permissions = stereotypes
@@ -196,15 +196,15 @@ private Task<bool> UpdateRolesForEnabledFeatureAsync(Role role, IEnumerable<IPer
196196

197197
if (!permissions.Any())
198198
{
199-
return Task.FromResult(false);
199+
return false;
200200
}
201201

202-
return UpdatePermissionsAsync(role, permissions);
202+
return UpdatePermissions(role, permissions);
203203
}
204204

205-
private async Task<bool> UpdatePermissionsAsync(Role role, IEnumerable<string> permissions)
205+
private bool UpdatePermissions(Role role, IEnumerable<string> permissions)
206206
{
207-
if (await _systemRoleNameProvider.IsAdminRoleAsync(role.RoleName))
207+
if (_systemRoleProvider.IsAdminRole(role.RoleName))
208208
{
209209
// Don't update claims for admin role.
210210
return true;

src/OrchardCore.Modules/OrchardCore.Roles/Startup.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@ public Startup(IShellConfiguration shellConfiguration)
3333
public override void ConfigureServices(IServiceCollection services)
3434
{
3535
services.AddScoped<IUserClaimsProvider, RoleClaimsProvider>();
36+
37+
services.AddDataMigration<SystemRolesMigrations>();
3638
services.AddDataMigration<RolesMigrations>();
39+
3740
services.AddScoped<RoleStore>();
3841
services.Replace(ServiceDescriptor.Scoped<IRoleClaimStore<IRole>>(sp => sp.GetRequiredService<RoleStore>()));
3942
services.Replace(ServiceDescriptor.Scoped<IRoleStore<IRole>>(sp => sp.GetRequiredService<RoleStore>()));

src/OrchardCore.Modules/OrchardCore.Settings/Services/SuperUserHandler.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,14 @@ namespace OrchardCore.Settings.Services;
1111
public class SuperUserHandler : IAuthorizationHandler
1212
{
1313
private readonly ISiteService _siteService;
14-
private readonly ISystemRoleNameProvider _systemRoleNameProvider;
14+
private readonly ISystemRoleProvider _systemRoleProvider;
1515

1616
public SuperUserHandler(
1717
ISiteService siteService,
18-
ISystemRoleNameProvider systemRoleNameProvider)
18+
ISystemRoleProvider systemRoleProvider)
1919
{
2020
_siteService = siteService;
21-
_systemRoleNameProvider = systemRoleNameProvider;
21+
_systemRoleProvider = systemRoleProvider;
2222
}
2323

2424
public async Task HandleAsync(AuthorizationHandlerContext context)
@@ -30,7 +30,9 @@ public async Task HandleAsync(AuthorizationHandlerContext context)
3030
return;
3131
}
3232

33-
if (user.IsInRole(await _systemRoleNameProvider.GetAdminRoleAsync()))
33+
var adminRole = _systemRoleProvider.GetAdminRole();
34+
35+
if (user.IsInRole(adminRole.RoleName))
3436
{
3537
SucceedAllRequirements(context);
3638

src/OrchardCore.Themes/TheAdmin/Recipes/blank.recipe.json

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,6 @@
6969
{
7070
"name": "Roles",
7171
"Roles": [
72-
{
73-
"Name": "Administrator",
74-
"Description": "A system role that grants all permissions to the assigned users.",
75-
"Permissions": []
76-
},
7772
{
7873
"Name": "Moderator",
7974
"Description": "Grants users the ability to moderate content.",
@@ -93,16 +88,6 @@
9388
"Name": "Contributor",
9489
"Description": "Grants users the ability to contribute content.",
9590
"Permissions": []
96-
},
97-
{
98-
"Name": "Authenticated",
99-
"Description": "A system role representing all authenticated users.",
100-
"Permissions": []
101-
},
102-
{
103-
"Name": "Anonymous",
104-
"Description": "A system role representing all non-authenticated users.",
105-
"Permissions": []
10691
}
10792
]
10893
}

src/OrchardCore.Themes/TheAdmin/Recipes/headless.recipe.json

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,6 @@
6464
{
6565
"name": "Roles",
6666
"Roles": [
67-
{
68-
"Name": "Administrator",
69-
"Description": "A system role that grants all permissions to the assigned users.",
70-
"Permissions": []
71-
},
7267
{
7368
"Name": "Moderator",
7469
"Description": "Grants users the ability to moderate content.",
@@ -97,11 +92,6 @@
9792
"ExecuteGraphQL",
9893
"ExecuteApiAll"
9994
]
100-
},
101-
{
102-
"Name": "Anonymous",
103-
"Description": "A system role representing all non-authenticated users.",
104-
"Permissions": []
10595
}
10696
]
10797
},

src/OrchardCore.Themes/TheAgencyTheme/Recipes/agency.recipe.json

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,6 @@
7373
{
7474
"name": "Roles",
7575
"Roles": [
76-
{
77-
"Name": "Administrator",
78-
"Description": "A system role that grants all permissions to the assigned users.",
79-
"Permissions": []
80-
},
8176
{
8277
"Name": "Moderator",
8378
"Description": "Grants users the ability to moderate content.",
@@ -97,16 +92,6 @@
9792
"Name": "Contributor",
9893
"Description": "Grants users the ability to contribute content.",
9994
"Permissions": []
100-
},
101-
{
102-
"Name": "Authenticated",
103-
"Description": "A system role representing all authenticated users.",
104-
"Permissions": []
105-
},
106-
{
107-
"Name": "Anonymous",
108-
"Description": "A system role representing all non-authenticated users.",
109-
"Permissions": []
11095
}
11196
]
11297
},

0 commit comments

Comments
 (0)