Záhada s Uploadify a sessions – error 303

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
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?