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; } } } }