piektdiena, 2011. gada 7. janvāris

Kā izlikties par citu lietotāju (impersonation)

Vajadzība izlikties par citu lietotāju man visbiežāk rodas tad, ja ir jātestē kāds vaicājums/procedūra/neznu_kas_vēl, kas strādā savādāk atkarībā no tā, kas izpilda attiecīgo komandu. Piemēram, ja vaicājumā where daļā ir izmantota SQL Server funkcija is_member vai, piemēram, kāda no daudzajām lietotāja vārda iegūšanas funkcijām (SQL Server iebūvētās funkcijas).

Vēsturiski esmu pieradis izmantot komandu SetUser. Lai to izpildītu jābūt sysadmin lomai piederošam, vai arī attiecīgajā datu bāzē jābūt db_owner grupai piederošam. Paveikt to ir pavisam vienkārši:
-- šajā vietā vēl esmu es pats
setuser 'Liene'
-- te esmu Liene
select suser_sname(), original_login()
-- tagad gribu būt atpakaļ es pats, tādēļ nākamā komanda:
setuser
-- un šeit esmu atkal es pats
select suser_sname(), original_login()
Original_Login funkcija atgriezīs manu īsto pieslēgšanās vārdu.

Bet vēsturiskais pieradums jālabo uz labāku stilu, un tad ir jāizmanto Execute As.
-- šajā vietā vēl esmu es pats
Execute As Login = 'Liene'
-- te esmu Liene
select suser_sname(), original_login()
-- tagad gribu būt atpakaļ es pats
Revert
-- un šeit esmu atkal es pats, tādēļ nākamā komanda:
select suser_sname(), original_login()
Execute As ir jaudīga iespēja, jāņem vērā vairākas nianses. Piemēram, Execute as User darbojas datu bāzes ietvaros, kamēr Execute as Login darbojas servera ietvaros.

Tad vēl dažas piezīmes:
* Execute As šiet ir apskatīts tikai viens pielietojums. Praksē šis tiek izmantots arī citiem nolūkiem (piemēram, var paskatīt rakstu Datu drošība divu datu bāzu gadījumā vai Pieteikšanās (logon) trigeri).
* Is_Memeber strādā pavisam interesanti ja lietotājs pieder lomai sysadmin.
* Neliela piezīme par SetUser. 99.99% gadījumos setuser strādā lieliski, bet man bija gadījums, kad vaicājums saturēja linkoto serveri un vaicājums lamājās pēc setuser. Savukārt pieslēdzoties kā konkrētajam lietotājam (neizmantojot setuser) strādāja viss lieliski. Iemeslu nesapratu :( un arī nepamēģināju, vai līdzīgi būtu ar Execute As.

Nav komentāru:

Ierakstīt komentāru