Nechce se přihlásit do systemu
- marcelxy
- Člen | 70
Prosím o radu,
myslím ze mám všechno správně,
dle předlohy
, db funguje,
když mu zadám špatné heslo pozná to,odpoví že je špatné
heslo,jméno,
ale když mu dám správné údaje tak nic neodpoví a nic neudělá,
nepřihlásí se a ani nikam nepřesměruje
a zůstane na loginu a v tracy není identita.
jedině kdy se přihlásí když mu dám do prvního presenteru natvrdo! do
startup()
$user->login('uzivatel','heslo');
tak pak se přihlásí!
nevím proč?
nevím kde mam hledat chybu?
diky za rady.
Editoval marcelxy (11. 1. 2021 19:19)
- Marek Bartoš
- Nette Blogger | 1280
Ukaž prosím kód přihlašovacího presenteru, tipuju že chybka bude v něm. Případně v base presenteru, pokud nějaký máš.
- marcelxy
- Člen | 70
je te v podstate dle predlohy,
<?php
namespace App\Model;
use Nette;
use Nette\Security\SimpleIdentity;
class UserManager implements Nette\Security\Authenticator
{
private $database;
private $passwords;
public function __construct(
Nette\Database\Explorer $database,
Nette\Security\Passwords $passwords
) {
$this->database = $database;
$this->passwords = $passwords;
}
public function authenticate(string $username, string $password): SimpleIdentity
{
$row = $this->database->table('users')
->where('username', $username)
->fetch();
if (!$row) {
throw new Nette\Security\AuthenticationException('User not found.');
}
if (!$this->passwords->verify($password, $row->password)) {
throw new Nette\Security\AuthenticationException('Invalid password.');
}
return new SimpleIdentity(
$row->id,
$row->role,
['name' => $row->username]
);
}
}
<?php
namespace App\Forms;
use Nette;
use Nette\Application\UI\Form;
use Nette\Security\User;
class SignFormFactory
{
/** @var FormFactory */
private $factory;
/** @var User */
private $user;
public function __construct(FormFactory $factory, User $user)
{
$this->factory = $factory;
$this->user = $user;
}
/**
* @return Form
*/
public function create()
{
$form = $this->factory->create();
$form->addText('username', 'Username:')
->setAttribute('class', 'form-control')
->setAttribute('placeholder', 'Username')
->setRequired('Please enter your username.');
$form->addPassword('password', 'Password:')
->setAttribute('class', 'form-control')
->setAttribute('placeholder', 'Password')
->setRequired('Please enter your password.');
$form->addCheckbox('remember', 'Keep me signed in');
$form->addSubmit('send', 'Sign in')
->setAttribute('class', 'btn btn-lg btn-green btn-block');
$form->onSuccess[] = array($this, 'formSucceeded');
return $form;
}
public function formSucceeded(Form $form, $values)
{
if ($values->remember) {$this->user->setExpiration('14 days'); } else {$this->user->setExpiration('14 days'); }
try { $this->user->login($values->username,$values->password);
} catch (Nette\Security\AuthenticationException $e) {
$form->addError('The username or password you entered is incorrect.');
}
}
}
namespace App\Forms;
use Nette;
use Nette\Application\UI\Form;
class FormFactory
{
/**
* @return Form
*/
public function create()
{
return new Form;
}
}
namespace App\Presenters;
use Nette;
use App\Forms\SignFormFactory;
class SignPresenter extends BasePresenter
{
/** @persistent */
public $backlink = '';
public $user;
/** @var SignFormFactory @inject */
public $factory;
protected function beforeRender()
{
parent::beforeRender();
$this->setLayout('login');
}
/**
* Sign-in form factory.
* @return Nette\Application\UI\Form
*/
protected function createComponentSignInForm()
{
$form = $this->factory->create();
$form->onSuccess[] = function ($form) {
$this->restoreRequest($this->backlink);
$form->getPresenter()->redirect('Home:alerts',['task'=>'today']);
};
return $form;
}
public function actionOut()
{
$this->getUser()->logout();
}
}
- Marek Bartoš
- Nette Blogger | 1280
$this->restoreRequest($this->backlink);
volej jen, pokud
není backlink prázdný. Tahle metoda tě totiž přesměrovává a
s prázdným backlinkem tě nejspíš pošle na tutéž stránku, na které
zrovna jsi.
$form->getPresenter()->redirect('Home:alerts',['task'=>'today']);
tak nikdy nenastane.
Editoval Mabar (11. 1. 2021 19:55)
- marcelxy
- Člen | 70
no to uz jsem taky skousel je to beze zmeny,
protected function createComponentSignInForm()
{
$form = $this->factory->create();
$form->onSuccess[] = function ($form) {
//$this->restoreRequest($this->backlink);
$form->getPresenter()->redirect('Home:alerts',['task'=>'today']);
};
return $form;
}
porad dela totez,pozna kdyz mu dam spatne udaje
a kdyz mu dam sprane tak se neprihlasi a zustane na miste a nerekne nic co
mu chybi!
jedine s timto se prihlasi:
abstract class SecuredPresenter extends BasePresenter
{
public function startup()
{
parent::startup();
$user->login('uzivatel','heslo');
if (!$user->isLoggedIn()) {
$this->redirect('Sign:in', ['backlink' => $this->storeRequest()]);
$this->terminate();
}
}
Editoval marcelxy (11. 1. 2021 20:17)
- lookass
- Člen | 54
Jednou jsem řešil něco hodně podobného a problém byl ve druhém
parametru konstruktoru pro SimpleIdentity (roles), protože jsem tam cpal
z entity $user seznam rolí, což byl objekt (OneHasMany z Nextras Orm), ale
asi to nebude tvůj případ, když používáš Nette\Database\Explorer,
každopádně bych si ale být tebou vydumpoval všechny parametry toho
konstruktoru.
Potom mě ještě napadá, jestli to směřuješ na tento authenticator?
common.neon:
services:
authenticator: App\Model\UserManager
- marcelxy
- Člen | 70
v comon.neon mam
services:
- App\Model\UserManager
kdyz mu dam toto coz je to samy
services:
authenticator: App\Model\UserManager
tak zadna zmena, porad se neprihlasi ale pozna vsechny spatne zadane
udaje
ono kdyby mu neco chybelo tak si nato stezuje,
ale on si nanic nestezuje on se akorat neprihlasi!
dekuji za kazdou radu
- Lumeriol
- Generous Backer | 64
Napadá mne možná blbost, ale tím, že to máš bez SSL, tedy čisté http, a pravděpodobně prohlížeč na bázi Chromia, tak v tom může hrát roli nastavení cookies. Takže bych se zkusil podívat na nastavení cookieSecure a cookieSamesite. Ve Firefoxu bys měl mít možnost ještě spustit http protokol s nezabezpečenými cookies, Chrome již vyžaduje mít nastaveno minimálně parametr Secure.
EDIT: teoreticky se tak přihlásí, ale neuloží se do session, takže to vypadá, že to nefunguje a nepřihlašuje.
Editoval Lumeriol (14. 1. 2021 19:57)
- marcelxy
- Člen | 70
jj to bude asi ono! diky za radu
v cookies mam prazdno!
this set-cookie was blocked because its domain atribute was invalid with regards
to the corent host url.
Request URL: http://192.168.1.11/…/www/sign/in?…
Response:
Set-Cookie: PHPSESSID=19b8uf9ali1m9g29t5dfd2ir75; expires=Thu, 28-Jan-2021
23:15:59 GMT; Max-Age=1209600; path=/; domain=infoviewer; HttpOnly;
SameSite=Lax
jede to na mem domacim servru, jak mam nette nastavit domenu jako ipadresu
tzn 192.168.1.11 ?
diky vsem za rady.
Editoval marcelxy (15. 1. 2021 2:06)