Zabezpečení a modifikace dotazů
reklama
Autentizace
Pozorný čtenář si jistě během čtení předchozích dílů položil otázku jak zajistit „ověřování uživatelů“. Odpověď je velmi jednoduchá, ADO.NET Data Services autentizaci nijak neřeší. Přístup k webové službě je třeba řídit prostředky serveru nebo např. prostředky ASP.NET.
Nastavení práv
Pokud si zkusíte vytvořit novou službu ADO.NET Data Services beze změny konfigurace, neposkytuje při spuštění žádné zdroje. Každému zdroji je třeba specifikovat operace, které je možné provádět. Pro tento účel je určena metoda InitializeService, ve které je dostupný parametr typu IDataServiceConfiguration. Máme-li zdroj, poskytující entity typu a, je třeba přidat např. řádek
config.SetEntitySetAccessRule("a", EntitySetRights.All);
Výčtový typ EntitySetRights nabízí několik možností. Typ je definován s atributem Flags, takže je možné hodnoty kombinovat.
| None |
Žádné operace nejsou povoleny. |
| ReadSingle |
Je povolenou číst pouze jednotlivé entity (pomocí klíče). |
| ReadMultiple |
Je povoleno získat celou množinu entit. |
| AllRead |
Odpovídá předchozím dvěma hodnotám. |
| WriteAppend |
Je povolenou přidávat nové entity. |
| WriteReplace |
Je povoleno entity měnit a pro nespecifikované vlastnosti jsou nastaveny implicitní hodnoty. |
| WriteDelete |
Je povoleno mazat entity. |
| WriteMerge |
Je povoleno entity měnit, ale nespecifikované vlastnosti nejsou měněny/nejsou použity implicitní. |
| AllWrite |
Zkratka pro všechny Write… operace. |
| All |
Povoleny jsou všechny operace. |
Ve výsledku je tedy možné mít například následující konfiguraci:
config.SetEntitySetAccessRule("b", EntitySetRights.AllRead);
config.SetEntitySetAccessRule("a", EntitySetRights.ReadSingle | EntitySetRights.WriteAppend | EntitySetRights.WriteDelete);
Pokud je pro některou entitu nastaveno EntitySetRights.None, potom není vidět v seznamu entit a také všechny asociace na tuto entitu nebudou ve výsledném XML/JSON zahrnuty. Požadavek na tuto(y) entitu(y) bude vždy ukončen chybou HTTP 404.
Podobné možnosti nabízí konfigurace Service Operations metod. Výčtový typ ServiceOperationRights nabízí volby None, ReadSingle, ReadMultiple se stejnými významy jako EntitySetRights a ještě AllRead a All, které mají stejný význam jako použití ReadSingle a ReadMultiple dohromady (AllRead a All se nijak neliší).
Query Interceptors
Ačkoli nastavení práv na jednotlivé zdroje může být dostatečné, často je třeba mnohem jemnější řízení toho, „co se děje“. Pro tento případ jsou tu tzv. Query Interceptors. Jedná se o metody, které vstupují do zpracování dotazu resp. jeho výsledku a mohou jej (téměř) libovolně modifikovat. Mohou také validovat, či upravovat vstupy pro CUD operace.
Metody pro tento účel určené, jsou odekorovány atributem QueryInterceptor(string) a mohou libovolně zpracovávat výsledek dotazu.
[QueryInterceptor("b")]
public Expression<Func<MyModel.b, bool>> Queryb()
{
return b => b.id % 2 == 0;
}
Nebo příklad na omezení na entity vytvořené právě přihlášeným uživatelem:
public Expression<Func<MyModel.SomeEntity, bool>> QuerySomeEntity ()
{
return x => x.CreatedBy == HttpContext.Current.User.Identity.Name;
}
Možností jak si pohrát s výsledkem je opravdu nespočet.
Pro CUD je připraven atribut ChangeInterceptor(string), který identifikuje metody mající na starosti zpracování změn dat. V této metodě máme přístupný objekt, který je měněn a dále informaci o jakou změnu se jedná. Metoda může vypadat takto:
[ChangeInterceptor("b")]
public void OnChangeb(MyModel.b b, UpdateOperations operation)
{
switch (operation)
{
case UpdateOperations.Add:
b.y = b.y + b.y;
break;
case UpdateOperations.Delete:
throw new DataServiceException(505, "Zadne mazani! :-P");
break;
}
}
Jakékoli změny, které provedeme na daném objektu, se promítnou následně do datového zdroje. Zastavit zpracování můžeme vyhozením výjimky. Pokud použijeme jako výjimka DataServiceException, můžeme specifikovat i chybový kód HTTP, většinou tedy z řady 5xx event. 4xx.
Pomocí práv můžeme jednoduše řídit přístup k jednotlivým entitám, avšak teprve Query Interceptors nám dávají do ruky poměrně mocnou zbraň. S jejich pomocí můžeme vystavět velice složité konstrukce validací dat anebo omezení přístupu.