Zarządzaj dostępem do jednostek i uprawnieniami za pomocą Entity Framework
W aplikacji internetowej korzystającej z Entity Framework 4.1 używamy członkostwa SQL Server do zarządzania dostępem użytkowników. Musimy jednak zaimplementować bardziej szczegółowy zestaw ról i zarządzanie uprawnieniami.
W bazie danych stworzyliśmy już odpowiednie tabele:
- Roles
- Permissions
- UserInRole (roles per user)
- RolesPermissions (permissions associated to a role)
Używając atrybutów niektórych podstawowych jednostek ograniczamy dostęp semantycznie za pomocą EF, na przykład, podając konkretnego użytkownika, może on zobaczyć tylko względne wysłane zamówienia lub nieodłączne dane.
Teraz chcielibyśmy wprowadzić do niego uprawnienia, na przykład, że aklient widzi i tworzy zamówienia, a afirma (są to dwie różne role) mogą widzieć tylko zamówienia na ich produkty, a także drukować raporty.
Pomysł polegałby na użyciu atrybutów również dla uprawnień na poziomie jednostki i sprawdzeniu, czy bieżący użytkownik posiada odpowiednie prawa, gdy metoda jest wywoływana. Na przykład:
public void BeforeAdd()
{
// Get required permissions for the specific entity (Order as example)
//Check that current user has permission of creating a new Order
}
Taka metoda byłaby wywoływana przez każdą jednostkę, pozwalając na scentralizowanie kontroli nad uprawnieniami na poziomie jednostki.
Używamy MVC jako frontendu i tam już zaimplementowaliśmy dostęp do ról i uprawnień. Musimy zrobić to samo z częścią zaplecza (zawierającą warstwę danych). Są to dwa oddzielne serwery komunikujące się za pośrednictwem usług internetowych. Wdrożenie zarządzania uprawnieniami na tylnej części wzmocniłoby kontrolę dostępu do danych.
Czy istnieje jakiś wzorzec lub najlepsza praktyka, którą moglibyśmy śledzić (ostatecznie używając niektórych wbudowanych funkcji EF), aby osiągnąć zarządzanie uprawnieniami?