.NET CORE - политика с множеством требований, каждое из которых имеет свой собственный ресурс.
Я пытаюсь использовать авторизацию на основе политик и ресурсов. Допустим, у меня есть сотрудники, и у этих сотрудников есть специальности и службы, и, конечно же, начальники.
- Сотрудник может быть изменен с помощью босса и другого сотрудника, который работает на своего босса и имеет привилегии.
- специальность не может быть добавлена к сотруднику, если она у него уже есть.
- также нельзя добавить услугу сотруднику, если она у него уже есть.
Чтобы максимизировать возможность повторного использования, мой подход заключался в трех требованиях. CanEditEmployeeRequirement, CanManageEmployeeServicesRequirement и CanManageEmployeeSpecialtiesRequirement.
У первого требования есть обработчик, который принимает ресурс (Employee) в качестве параметра, выполняет необходимые проверки и завершается неудачно или успешно на основе этих проверок.
У второго требования есть обработчик, который принимает (EmployeeService) в качестве параметра, проверяет, что у сотрудника нет службы, и продолжает работу.
У третьего требования есть обработчик, который выполняет то же самое, что и второе, но с другой моделью (EmployeeSpecialty).
Теперь моя логика состоит в том, чтобы создать 2 политики:
config.AddPolicy("CanManageEmployeeServices", policyBuilder =>
{
policyBuilder.Requirements.Add(new CanEditEmployeeRequirement());
policyBuilder.Requirements.Add(new CanManageEmployeeServicesRequirement());
});
и
config.AddPolicy("CanManageEmployeeSpecialties", policyBuilder =>
{
policyBuilder.Requirements.Add(new CanEditEmployeeRequirement());
policyBuilder.Requirements.Add(new CanManageEmployeeSpecialtiesRequirement());
});
каждый занимается тем, чтобы убедиться, что у вызывающего абонента есть доступ к сотруднику, и что ресурс может быть добавлен к сотруднику.
Проблема с этим подходом здесь:
public ActionResult<BusinessOwnerService> AddServiceToEmployee([FromBody] EmployeeService service)
{
var result = _authorizationService.AuthorizeAsync(User, service, "CanManageEmployeeServices").Result;
if(!result.Succeeded)
return StatusCode(403, "some error message.");
//rest of code
}
Выше я передаю один ресурс (сервис) сервису авторизации. в то время как у политики есть два требования, и каждое относится к разному ресурсу. И, конечно же, авторизация не выполняется, потому что второй обработчик требований (тот, который принимает Employee в качестве ресурса) недоступен, потому что ему не был передан Employee.
У меня вопрос: возможно ли то, что я делаю? имеет ли это смысл?если да, как мне реализовать это, чтобы я мог пройти обе модели? если нет, не могли бы вы указать мне правильное направление, пожалуйста?
Остальной код:
Первое требование:
public class CanManageEmployeeServicesRequirement : IAuthorizationRequirement
{
}
Его обработчик:
public class CanManageEmployeeServicesHandler : AuthorizationHandler<CanManageEmployeeServicesRequirement, EmployeeService>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CanManageEmployeeServicesRequirement requirement, EmployeeService resource)
{
//handler Code
}
Второе требование:
public class CanManageEmployeeSpecialtiesRequirement : IAuthorizationRequirement
{
}
Его обработчик:
public class CanManageEmployeeSpecialtiesHandler : AuthorizationHandler<CanManageEmployeeSpecialtiesRequirement , EmployeeSpecialty>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CanManageEmployeeServicesRequirement requirement, EmployeeSpecialty resource)
{
//handler Code
}
Третье требование:
public class CanEditEmployeeRequirement : IAuthorizationRequirement
{
}
Его обработчик:
public class CanEditEmployeeHandler : AuthorizationHandler<CanEditEmployeeRequirement , Employee>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, CanManageEmployeeServicesRequirement requirement, Employee resource)
{
//handler Code
}