Tomáš Holý
23.6.2014

Spring Security Impersonation



Pojem Impersonation (počeštěně Impersonifikace), který v doslovném překladu znamená imitování nebo zosobnění, se dá vysvětlit touto poučkou: Přihlášený uživatel předstírá, že je někdo jiný, aby získal práva a data cizího uživatele.

Na první pohled to může působit jako potenciální problém zabezpečení Vaší aplikace. Pokud by totiž některý uživatel získal předstíráním přístup k aplikaci jako někdo úplně jiný, aniž by musel znát jeho přihlašovací heslo, mohl by jednoduše pracovat s daty, ke kterým nemá mít přistup, číst je, editovat nebo mazat. Tomu je samozřejmě třeba zabránit.
Když se na to ovšem podíváme z druhé strany, dá se impersonifikace velice dobře využít v aplikační podpoře. Například pokud na aplikační podporu zavolá uživatel s problémem, může se člen aplikační podpory impersonifikovat za volajícího uživatele, aniž by musel znát jeho heslo. Tím získá jeho práva a také přístup k jeho datům, takže vidí v aplikaci to samé co volající.
Snadněji tak může pomoci s vyřešením problému, který volající má. Pokud není možné daný problém jednoduše vyřešit, lze jej s přesným popisem vložit do bugtracking systému. Dost bylo teorie, teď se podívejme na jednoduchý příklad implementace pomocí Spring Security.

Základem implementace je filtr, který se přidá k již existující securipojemty konfiguraci. Tento nový SwitchUserFilter vyžaduje předat pouze implementaci UserDetailsService, která načítá detail uživatele, za kterého se snažíte impersonifikovat, na základě jeho přihlašovacího jména. Můžete také volitelně nastavit URL, na které bude filtr reagovat. 

<bean id="switchUserFilter" class="org.springframework.security.web.authentication.switchuser.SwitchUserFilter">
  <property name="userDetailsService" ref="userDetailsService" />
  <property name="switchUserUrl" value="/j_spring_security_switch_user" />
  <!—default nastavení--> 
  <property name="exitUserUrl" value="/j_spring_security_exit_user" />
  <!—default nastavení-->
  <property name="targetUrl" value="/home" /> 
</bean>

Dále je třeba filtr přidat do security konfigurace na pozici SWITCH_USER_FILTER. Důležité je nezapomenout zabezpečit URL, na které se provádí impersonifikace, aby nemohlo dojít ke zneužití v případě, že uživatel nemá dostatečná práva.

<http auto-config="true" use-expressions="true">
  <custom-filter position="SWITCH_USER_FILTER" ref="switchUserProcessingFilter" />
  <intercept-url pattern="/j_spring_security_switch_user" access="hasRole('ROLE_SUPERVISOR')"/>
  … 
</http>

Pokud filtr zachytí požadavek na adrese /j_spring_security_switch_user, vytvoří novou autentizaci (Authentication) pro impersonifikovaného uživatele a nastaví ji do SecurityContextu. Jaký uživatel má být načten se určí na základě hodnoty v parametru j_username. Autentizační data původně přihlášeného uživatele jsou uložena do objektu SwitchUserGrantedAuthority a přidána do seznamu oprávnění impersonifikovaného uživatele. Díky tomu je možné impersonifikaci zrušit a obnovit autentizaci původního uživatele.

Tento článek měl pouze nastínit popis impersonifikace uživatelů, výhody použití a jednoduchost implementace ve Springu. Příklad je samozřejmě možné dále rozšiřovat tak, aby vyhovoval přesně vašim potřebám. Komentáře a případné doplňující informace uvítám.

Vaše emailová adresa nebude zveřejněna

Komentáře

Děkujeme za váš komentář
Další