PSTW_CentralizeSystem/CustomPolicy/RoleModulePolicy.cs
2024-11-20 16:27:35 +08:00

134 lines
5.3 KiB
C#

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using PSTW_CentralSystem.DBContext;
using PSTW_CentralSystem.Models;
using Newtonsoft.Json;
using System.Text.Json;
using System.Data;
namespace PSTW_CentralSystem.CustomPolicy
{
public class RoleModulePolicy : IAuthorizationRequirement
{
}
public class RoleModuleHandler : AuthorizationHandler<RoleModulePolicy>
{
private readonly AuthDBContext _authDBContext;
private readonly UserManager<UserModel> _userManager;
private readonly RoleManager<RoleModel> _roleManager;
private readonly IHttpContextAccessor _httpContextAccessor;
public RoleModuleHandler( AuthDBContext authDBContext, UserManager<UserModel> userManager, RoleManager<RoleModel> roleManager, IHttpContextAccessor httpContextAccessor)
{
_authDBContext = authDBContext;
_userManager = userManager;
_roleManager = roleManager;
_httpContextAccessor = httpContextAccessor;
}
protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, RoleModulePolicy requirement)
{
// Get the current user
var currentUser = await _userManager.GetUserAsync(context.User);
var userRole = await _userManager.GetRolesAsync(currentUser ?? new UserModel());
var moduleName = _httpContextAccessor.HttpContext?.GetRouteData().Values["controller"]?.ToString();
var pageName = _httpContextAccessor.HttpContext?.GetRouteData().Values["action"]?.ToString();
var registeredModule = _authDBContext.ModuleSettings.FirstOrDefault(x => x.ModuleName == moduleName);
if (checkIfSuperAdmin())
{
context.Succeed(requirement);
}
else {
checkModuleExistOrNot();
checkModuleHaveRoleOrNot();
}
bool checkIfSuperAdmin()
{
var superAdminRole = _authDBContext.Roles.Where(r => r.Name == "SuperAdmin").FirstOrDefault();
var sysAdminRole = _authDBContext.Roles.Where(r => r.Name == "SystemAdmin").FirstOrDefault();
if (userRole.ToString() != null && userRole.Contains("SuperAdmin") && superAdminRole?.Id == 1)
{
return true;
}
else if (userRole.ToString() != null && userRole.Contains("SystemAdmin") && sysAdminRole?.Id == 2)
{
return true;
}
else
{
return false;
}
}
void checkModuleExistOrNot()
{
if (registeredModule == null)
{
context.Fail();
}
else
{
checkModuleActiveOrNot();
}
}
void checkModuleActiveOrNot()
{
if (registeredModule.ModuleStatus == 0)
{
context.Fail();
}
}
void checkModuleHaveRoleOrNot()
{
var allowedUserTypes = registeredModule?.AllowedUserType ?? "";
if (allowedUserTypes == "Public" || userRole.Any(role => allowedUserTypes.Contains(role)))
{
context.Succeed(requirement);
}
else if (currentUser != null && allowedUserTypes == "Registered User" )
{
checkMethodAndRole();
}
else
{
context.Fail();
}
}
void checkMethodAndRole()
{
// Load all ModuleSettings and process them in memory
var moduleSettings = _authDBContext.ModuleSettings.AsEnumerable();
// Check if the method exists in the module settings
// Check if the method exists in the module settings
var isMethodExist = moduleSettings
.FirstOrDefault(m => m.MethodAllowedUserType?.Any(mt => mt.MethodName == pageName) == true);
if (isMethodExist != null) // Check if the method exists which means method is registered
{
var registeredMethod = moduleSettings.Where(m => m.MethodAllowedUserType != null && m.MethodAllowedUserType.Any(mt => mt.MethodName == pageName)).FirstOrDefault();
var allowedUserTypes = registeredMethod?.MethodAllowedUserType?.Where(mt => mt.MethodName == pageName).Select(mt => mt.AllowedUserTypesArray).FirstOrDefault() ?? Array.Empty<string>();
if (userRole.Any(role => allowedUserTypes.Contains(role)) || allowedUserTypes.Contains("All")) // Check if the user role is allowed, allowing only registered user to access.
{
context.Succeed(requirement);
}
else
{
context.Fail();
}
}
else // No method is registered to allow all method to be accessed
{
context.Succeed(requirement);
}
}
}
}
}