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