DepartmentProject/DepartmentPortal/Common/DatabaseCore/SecurityManager.cs

64 lines
2.1 KiB
C#
Raw Normal View History

using DatabaseCore.Models.Security;
using ModelTools.BindingModels;
using ModelTools.Enums;
using ModelTools.Interfaces;
using SecurityBusinessLogic.BusinessLogics;
using System.Linq;
namespace DatabaseCore
{
public class SecurityManager : ISecurityManager
{
public string ErrorMessage { get; set; }
public bool CheckAccess(AccessBindingModel model, AccessOperation operation, AccessType type, string entity)
{
using var context = DatabaseManager.GetContext;
Access access;
if (model != null)
{
// простой просмотр возможен
if (model.SkipCheck && type == AccessType.SimpleView)
{
return true;
}
// если не указан идентификатор пользователя, то смотрим, может он авторизован
if (!model.UserId.HasValue && UserManager.GetInstance.User != null)
{
model.UserId = UserManager.GetInstance.UserId;
}
var roles = context.UserRoles.Where(x => x.UserId == model.UserId).Select(x => x.Role).OrderByDescending(x => x.RolePriority).ToList();
if (roles == null)
{
ErrorMessage = $"Не верный пользователь";
return false;
}
access = context.Accesses.FirstOrDefault(a => a.Operation == operation && roles.Contains(a.Role));
}
else
{
access = context.Accesses.FirstOrDefault(a => a.Operation == operation && UserManager.GetInstance.Roles.Contains(a.RoleId));
}
if (access != null)
{
if (access.AccessType >= type) return true;
}
switch (type)
{
case AccessType.FullView:
ErrorMessage = $"Нет доступа на чтение данных по сущности '{entity}'";
return false;
case AccessType.Change:
ErrorMessage = $"Нет доступа на изменение данных по сущности '{entity}'";
return false;
case AccessType.Delete:
ErrorMessage = $"Нет доступа на удаление данных по сущности '{entity}'";
return false;
default:
ErrorMessage = $"Нет доступа по сущности '{entity}'";
return false;
}
}
}
}