Added PermissionService and added docs to all methods with potential user contact
This commit is contained in:
43
HopFrame.Security/Services/IPermissionService.cs
Normal file
43
HopFrame.Security/Services/IPermissionService.cs
Normal file
@@ -0,0 +1,43 @@
|
||||
namespace HopFrame.Security.Services;
|
||||
|
||||
public interface IPermissionService {
|
||||
|
||||
/// <summary>
|
||||
/// Checks for the user to have the specified permission
|
||||
/// Permission system:<br/>
|
||||
/// - "*" -> all rights<br/>
|
||||
/// - "group.[name]" -> group member<br/>
|
||||
/// - "[namespace].[name]" -> single permission<br/>
|
||||
/// - "[namespace].*" -> all permissions in the namespace
|
||||
/// </summary>
|
||||
/// <param name="permission">The permission the user needs</param>
|
||||
/// <returns>rather the user has the permission or not</returns>
|
||||
Task<bool> HasPermission(string permission);
|
||||
|
||||
/// <summary>
|
||||
/// Checks if the user has all the specified permissions
|
||||
/// </summary>
|
||||
/// <param name="permissions">list of the permissions</param>
|
||||
/// <returns>rather the user has all the permissions or not</returns>
|
||||
Task<bool> HasPermissions(params string[] permissions);
|
||||
|
||||
/// <summary>
|
||||
/// Checks if the user has any of the specified permissions
|
||||
/// </summary>
|
||||
/// <param name="permissions">list of the permissions</param>
|
||||
/// <returns>rather the user has any permission or not</returns>
|
||||
Task<bool> HasAnyPermission(params string[] permissions);
|
||||
|
||||
/// <summary>
|
||||
/// Checks for the user to have the specified permission
|
||||
/// Permission system:<br/>
|
||||
/// - "*" -> all rights<br/>
|
||||
/// - "group.[name]" -> group member<br/>
|
||||
/// - "[namespace].[name]" -> single permission<br/>
|
||||
/// - "[namespace].*" -> all permissions in the namespace
|
||||
/// </summary>
|
||||
/// <param name="permission">The permission the user needs</param>
|
||||
/// <param name="user">The user who gets checked</param>
|
||||
/// <returns>rather the user has the permission or not</returns>
|
||||
Task<bool> HasPermission(string permission, Guid user);
|
||||
}
|
||||
60
HopFrame.Security/Services/PermissionService.cs
Normal file
60
HopFrame.Security/Services/PermissionService.cs
Normal file
@@ -0,0 +1,60 @@
|
||||
using HopFrame.Database;
|
||||
using HopFrame.Security.Authorization;
|
||||
using HopFrame.Security.Claims;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace HopFrame.Security.Services;
|
||||
|
||||
internal class PermissionService<TDbContext>(TDbContext context, ITokenContext current) : IPermissionService where TDbContext : HopDbContextBase {
|
||||
public async Task<bool> HasPermission(string permission) {
|
||||
return await HasPermission(permission, current.User.Id);
|
||||
}
|
||||
|
||||
public async Task<bool> HasPermissions(params string[] permissions) {
|
||||
var user = current.User.Id.ToString();
|
||||
var perms = await GetFullPermissions(user);
|
||||
|
||||
foreach (var permission in permissions) {
|
||||
if (!PermissionValidator.IncludesPermission(permission, perms)) return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public async Task<bool> HasAnyPermission(params string[] permissions) {
|
||||
var user = current.User.Id.ToString();
|
||||
var perms = await GetFullPermissions(user);
|
||||
|
||||
foreach (var permission in permissions) {
|
||||
if (PermissionValidator.IncludesPermission(permission, perms)) return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public async Task<bool> HasPermission(string permission, Guid user) {
|
||||
var permissions = await GetFullPermissions(user.ToString());
|
||||
|
||||
return PermissionValidator.IncludesPermission(permission, permissions);
|
||||
}
|
||||
|
||||
private async Task<string[]> GetFullPermissions(string user) {
|
||||
var permissions = await context.Permissions
|
||||
.Where(perm => perm.UserId == user)
|
||||
.Select(perm => perm.PermissionText)
|
||||
.ToListAsync();
|
||||
|
||||
var groups = permissions
|
||||
.Where(perm => perm.StartsWith("group."))
|
||||
.ToList();
|
||||
|
||||
var groupPerms = await context.Permissions
|
||||
.Where(perm => groups.Contains(user))
|
||||
.Select(perm => perm.PermissionText)
|
||||
.ToListAsync();
|
||||
|
||||
permissions.AddRange(groupPerms);
|
||||
|
||||
return permissions.ToArray();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user