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