64 lines
2.1 KiB
C#
64 lines
2.1 KiB
C#
|
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;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|