Cześć, temat teoretycznie prosty. Czy użytkownik może usunąć rekord w bazie danych? Teoretycznie:
[Authorize]
[HttpDelete("id")]
public async Task<IActionResult> DeleteDaMadafackinRecord(Guid id)
{
IdentityResult res = await service.DeleteRecord(id);
if(res.Succeded)
return Ok();
else
return BadRequest();
}
Ale teraz pojawiają się pytania. Co zrobić, jeśli użytkownik chce usunąć nie swój rekord? Jeśli idkami są guidy, to prawdopodobieństwo jest dość małe na złośliwość, ale jest to możliwe, że w jakiś sposób znajdzie istniejący guid. Więc, wymyśliłem bardzo proste rozwiązanie, które załatwia mi cały problem i dodatkowo jest testowalne. A mianowicie, w serwisie zawarłem coś takiego:
public async Task<IdentityResult> DeleteRecord(Guid id)
{
if(!loggedUserProvider.IsAdmin())
{
SystemUser su = await GetOwner(id); //pobieram właściciela tego rekordu
if(loggedUserProvider.GetLogged() != su)
return IdentityResult.Failed(...);
}
await db.DeleteRecord(id);
}
Tak to mniej więcej wygląda. Czyli w serwisie sprawdzam, czy zalogowany użytkownik jest adminem albo właścicielem tego dokumentu. I tylko wtedy pozwalam na usunięcie. Wydaje się to być dobrym rozwiązaniem, jest testowalne i działa. Zastanawiam się jednak, czy są jakieś inne rozwiązania (lepsze/gorsze), zwłaszcza w całym tym tłumie mechanizmów autoryzacji dostępnych w .NetCore 3?