From 643ceeb607e619d5cd3f10d063b17dfe48bbec58 Mon Sep 17 00:00:00 2001 From: Leon Hoppe Date: Sun, 21 Jul 2024 20:49:52 +0200 Subject: [PATCH] Finished user administration --- .../Services/IPermissionService.cs | 6 +- .../Implementation/PermissionService.cs | 24 +- HopFrame.Web/AdminPermissions.cs | 8 + .../Pages/Administration/AdminRoutes.razor | 16 -- .../Administration/Layout/AdminLayout.razor | 2 +- .../Administration/Layout/AdminMenu.razor | 11 +- .../Pages/Administration/UserEditPage.razor | 230 ++++++++++++++++-- .../Pages/Administration/UsersPage.razor | 36 ++- HopFrame.Web/Pages/Login.razor | 11 +- .../Services/Implementation/AuthService.cs | 30 ++- 10 files changed, 320 insertions(+), 54 deletions(-) create mode 100644 HopFrame.Web/AdminPermissions.cs diff --git a/HopFrame.Security/Services/IPermissionService.cs b/HopFrame.Security/Services/IPermissionService.cs index d9182b5..3f051b3 100644 --- a/HopFrame.Security/Services/IPermissionService.cs +++ b/HopFrame.Security/Services/IPermissionService.cs @@ -12,10 +12,14 @@ public interface IPermissionService { Task> GetUserPermissionGroups(User user); + Task RemoveGroupFromUser(User user, PermissionGroup group); + Task CreatePermissionGroup(string name, bool isDefault = false, string description = null); Task DeletePermissionGroup(PermissionGroup group); + Task GetPermission(string name, IPermissionOwner owner); + /// /// permission system:
/// - "*" -> all rights
@@ -28,7 +32,7 @@ public interface IPermissionService { /// Task AddPermission(IPermissionOwner owner, string permission); - Task DeletePermission(Permission permission); + Task RemovePermission(Permission permission); Task GetFullPermissions(string user); diff --git a/HopFrame.Security/Services/Implementation/PermissionService.cs b/HopFrame.Security/Services/Implementation/PermissionService.cs index fa7c297..bda9d8e 100644 --- a/HopFrame.Security/Services/Implementation/PermissionService.cs +++ b/HopFrame.Security/Services/Implementation/PermissionService.cs @@ -58,11 +58,22 @@ internal sealed class PermissionService(TDbContext context, ITokenCo var perms = await GetFullPermissions(user.Id.ToString()); return groups - .Where(group => PermissionValidator.IncludesPermission(group.Name, perms)) + .Where(group => perms.Contains(group.Name)) .Select(group => group.ToPermissionGroup(context)) .ToList(); } + public async Task RemoveGroupFromUser(User user, PermissionGroup group) { + var entry = await context.Permissions + .Where(perm => perm.PermissionText == group.Name && perm.UserId == user.Id.ToString()) + .SingleOrDefaultAsync(); + + if (entry is null) return; + + context.Permissions.Remove(entry); + await context.SaveChangesAsync(); + } + public async Task CreatePermissionGroup(string name, bool isDefault = false, string description = null) { var group = new GroupEntry { Name = name, @@ -81,6 +92,15 @@ internal sealed class PermissionService(TDbContext context, ITokenCo await context.SaveChangesAsync(); } + public async Task GetPermission(string name, IPermissionOwner owner) { + var ownerId = (owner is User user) ? user.Id.ToString() : ((PermissionGroup)owner).Name; + + return await context.Permissions + .Where(perm => perm.PermissionText == name && perm.UserId == ownerId) + .Select(perm => perm.ToPermissionModel()) + .SingleOrDefaultAsync(); + } + public async Task AddPermission(IPermissionOwner owner, string permission) { var userId = owner is User user ? user.Id.ToString() : (owner as PermissionGroup)?.Name; @@ -92,7 +112,7 @@ internal sealed class PermissionService(TDbContext context, ITokenCo await context.SaveChangesAsync(); } - public async Task DeletePermission(Permission permission) { + public async Task RemovePermission(Permission permission) { var entry = await context.Permissions.SingleOrDefaultAsync(entry => entry.RecordId == permission.Id); context.Permissions.Remove(entry); await context.SaveChangesAsync(); diff --git a/HopFrame.Web/AdminPermissions.cs b/HopFrame.Web/AdminPermissions.cs new file mode 100644 index 0000000..47221ed --- /dev/null +++ b/HopFrame.Web/AdminPermissions.cs @@ -0,0 +1,8 @@ +namespace HopFrame.Web; + +public static class AdminPermissions { + public const string IsAdmin = "hopframe.admin"; + public const string ViewUsers = "hopframe.admin.users.view"; + public const string EditUsers = "hopframe.admin.users.edit"; + public const string DeleteUsers = "hopframe.admin.users.delete"; +} \ No newline at end of file diff --git a/HopFrame.Web/Pages/Administration/AdminRoutes.razor b/HopFrame.Web/Pages/Administration/AdminRoutes.razor index bea6606..318c832 100644 --- a/HopFrame.Web/Pages/Administration/AdminRoutes.razor +++ b/HopFrame.Web/Pages/Administration/AdminRoutes.razor @@ -10,19 +10,3 @@ Navigator.NavigateTo("administration/users"); } } - -
-
- - - - - - - - -

No content found in nested layout

-
-
-
-
diff --git a/HopFrame.Web/Pages/Administration/Layout/AdminLayout.razor b/HopFrame.Web/Pages/Administration/Layout/AdminLayout.razor index 0fb7f41..4ea3d74 100644 --- a/HopFrame.Web/Pages/Administration/Layout/AdminLayout.razor +++ b/HopFrame.Web/Pages/Administration/Layout/AdminLayout.razor @@ -1,7 +1,7 @@ @using HopFrame.Web.Components @inherits LayoutComponentBase - +