Záhada s Uploadify a sessions – error 303

danielseek
Člen | 42
+
0
-

Dobrý den, téma tady bylo už jednou diskutováno: https://forum.nette.org/…fy-chyba-303

Pro Uploadify mám vytvořenou komponentu, která je připojená do Presenteru, který vyžaduje, aby byl uživatel přihlášený (SESSION). Problém je, že uploadify používá FLASH, tudíž se SESSION Id změní a nelze použít akci komponenty, protože v této session není uživatel přihlášený.

Věc jsem vyřešil tak, že do index.php jsem přidal (Kvůli nové verzi uploadify se moje řešení liší od toho, které je prezentováno v tématu výše):

//index.php
if (isset($_POST['imgUpSID'])) {
    session_id($_POST['imgUpSID']);
}
//při nastavování uploadify pomocí javascriptu pak nastavím formData
 'formData': {imgUpSID : {session_id()}}

Řešení funguje. Bohužel ale jen v administraci (AdminModule). Ve FrontModule mi to stále házi e303 a dokonce mi to zruší SESSION úplně a musím se přihlásit znovu. Nechápu jaký rozdíl je mezi těmito dvěma moduly.

Edit:
Tak jsem si zkoušel zjistit co se vlastně stane se session když kliknu na upload.
Zjistil jsem, že nette si pravděpodobně myslí, že uživatel zavřel prohlížeč a odhlásí ho (reason 4). Zvláštní je, že v session zůstane cely objekt s identitou uživatele.

[authenticated] => 1
[identity] => Nette\Security\Identity Object
    (
        [id:Nette\Security\Identity:private] => 45
        [roles:Nette\Security\Identity:private] => Array(Zůstavá stejný...)
        [data:Nette\Security\Identity:private] => Array (Zůstavá stejný...)
        [frozen:Nette\FreezableObject:private] =>
    )
[reason] =>
[authTime] => 1386530379
[expireTime] => 1386531580
[expireDelta] => 1200
[expireIdentity] =>
[expireBrowser] => 1
[browserCheck] => 1

Se změní na

[authenticated] => 0
[identity] => Nette\Security\Identity Object
    (
        [id:Nette\Security\Identity:private] => 45
        [roles:Nette\Security\Identity:private] => Array(Zůstavá stejný...)
        [data:Nette\Security\Identity:private] => Array (Zůstavá stejný...)
        [frozen:Nette\FreezableObject:private] =>
    )
[reason] => 4

přibyde také

[Nette.Application.Flash/n9yc] => Array
                        (
                            [flash] => Array
                                (
                                    [0] => stdClass Object
                                        (
                                            [message] => Access denied
                                            [type] => info
                                        )

                                )

                        )

Editoval danielseek (8. 12. 2013 22:43)

danielseek
Člen | 42
+
0
-

Tak už jsem na to přišel, nette mě úplně zcela jednoduše odhlašoval. Když je ukončena komunikace v rámci Flash, nette to chápe jako, že se uživatel zavřel okno prohlížeče a proto mne odhlásí. To, že IdentityObject zůstavá v session je běžné defaultní chování.

Rozdíl mezi AdminModule a FrontModule spočíval, v tom, že admin měl z nějakého důvodu nastaveno, aby uživatele neodhlásil, potom co zavře okno prohlížeče.

Dá se to nějak obejít, aniž bych úplně vyloučil možnost odhlášení uživatele když skutečně zavře okno prohlížeče?

RSS tématu Téma zavřeno