Neúspěšné přihlášení někde a někdy
- Taco
- Člen | 50
Zdravím.
Mám webovou aplikaci, velice jednoduchou s přihlašováním. Nainstalováno na wedosu.
Problém spočívá v tom, že doma mi to funguje všude. Ale když to ukazuju zákazníkovi v terénu někde na mobilu, tak to se nemůžu přihlásit. To nemůžu přihlásit znamená, že mě to přihlásí, ale přesměruje zpět na přihlašovací formulář. Když se ručně přesunu na stránku s informacemi o právě přihlášeném uživateli, tak se tam dostanu (pod anotací @User(loggedIn)), když se ale přesunu na titulní stránku (také pod anotací @User(loggedIn)), tak mě to přesměruje na přihlašovací. Ověřování a přesměrování vypadá takto:
if (in_array('loggedIn', $user, true) && !$this->getUser()->isLoggedIn()) {
$this->redirect(':Sign:in');
}
Jak už jsem uvedl, (ne)funguje to jen někdy. A nedaří se mi odpozorovat kdy, natož to nasimulovat.
V logu nic, session se vytváří, když ji smažu, tak jsem odhlášený…
Potřebuju nakopnout, kde bych měl hledat. Mě už došli nápady. Díky moc.
Editoval Taco (16. 9. 2018 23:40)
- Taco
- Člen | 50
Tak ten problém je docela zajímavý, protože to funguje tak, že:
Mám UserPresenter, SignPresenter a RegionPresenter. V layoutu mám
navigaci, kde je odkaz na User:current
a Region:
.
Jeden klient mi to rozbíjí použitím. Přihlásí se, a pak ho to
přesměruje na /sign/in
. Když klikne na Region:
(domena.tls/
) „přesměruje“ ho to na Sign:in
(domena.tls/sign/in
). Uvozovky u toho přesměrování jsou tam
proto, páč v debug není ten redirect uveden.
Když jsem si hrál s checkRequirements()
tak jsem zjistil, že se
do toho vůbec nedostane. Klientovi se to vždycky rozbije. Když se mu to
rozbije, nefunguje to i mě. Po pár minutách se to spraví. Dokavad se ten
klient zase nepokusí přihlásit.
Když klikne na User:current
(domena.tls/user/current
), dostane se normálně na detail účtu,
takže je vidět, že přihlášený je.
Chová se to tak, jako kdyby po kliknutí na domena.tls/
jsem se
dostal rovnou a přímo na domena.tls/sign/in
bez Netťáckého
přesměrování.
Routa je úplně triviální:
public static function createRouter()
{
$router = new RouteList;
$router[] = new Route('<presenter>/<action>[/<id>]', 'Region:default');
return $router;
}
Ještě zkusím zkontrolovat httaccess.
Běží mi to na wedosu. Tak snad tam nemájí nějaká kouzla.
Za jakýkoliv nápad moc dík.
- Taco
- Člen | 50
h4kuna napsal(a):
Ukaž nějaký besepresenter kde je definováný checkrequirment a startup. Nezapomněl jsi někde patent::checkRequirment()?
Žádný BasePresenter nepoužívám. Ani startup.
checkRequirment je triviální, jen jsem změnil z výjimky na přesměrování:
function checkRequirements($element)
{
$user = (array) UI\PresenterComponentReflection::parseAnnotation($element, 'User');
if (in_array('loggedIn', $user, true) && !$this->getUser()->isLoggedIn()) {
$this->redirect(':Sign:in');
//~ throw new Nette\Application\ForbiddenRequestException;
}
}
parent::checkRequirements($element)
mi tam sice nedává smysl,
ale zkusil jsem to přidat na záčatek i na konec mé implementace. Bez
efektu.
Jak jsem uváděl, je zajímavé, že se to do té metody
checkRequirements($element)
ani nedostane. Ono se to prostě
přesměruje úplně samo. Buď přímo na úrovni routeru – což je
nepravděpodobný, vzhledem k tomu, že to neřekne do Tracy. A nebo na
úrovni .htaccess, ale ten je taky triviální.
# Apache configuration file (see https://httpd.apache.org/docs/current/mod/quickreference.html)
Allow from all
# disable directory listing
<IfModule mod_autoindex.c>
Options -Indexes
</IfModule>
# enable cool URL
<IfModule mod_rewrite.c>
RewriteEngine On
# RewriteBase /
# prevents files starting with dot to be viewed by browser
RewriteRule /\.|^\.(?!well-known/) - [F]
# front controller
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz|map)$ index.php [L]
</IfModule>
# enable gzip compression
#<IfModule mod_deflate.c>
# <IfModule mod_filter.c>
# AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript application/json application/xml image/svg+xml
# </IfModule>
#</IfModule>