Nechce se přihlásit do systemu

marcelxy
Člen | 70
+
0
-

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 | 1169
+
0
-

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
+
0
-

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 | 1169
+
0
-

$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
+
0
-

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)

marcelxy
Člen | 70
+
0
-

zdravim jeste jednou,
porad nevim co stim? nevim kde hledat chybu?
proc se nechce prihlasit?
nevi prosim nekdo kde hledat chybu?

Šaman
Člen | 2635
+
0
-

Pro začátek – když dáš do formSucceeded() natvrdo jen přihlášení a žádný jiný kód – přihlásí to? Pak bych si zkusil catchnout i obecnou výjimku a zjistit, jestli ten try nějakou nevyhodil (jinou, než odchycenou AuthenticationException).

Editoval Šaman (14. 1. 2021 4:46)

marcelxy
Člen | 70
+
0
-

ne neprihlasise,
kdyz mu dam do

public function formSucceeded(Form $form, $values)
	{
      $this->user->login('uzivatel','heslo');
	}

neprihlasise zustane na prihlseni a v adrese ma porad backlink kde ho tam bere?

www/sign/in?backlink=3fn2n
marcelxy
Člen | 70
+
0
-

kdyz mu dam zachytit vyjimku

catch (Exception $e)

kdyz mu poslu spatne jmeno zachyti spatne jmeno
kdyz mu poslu spatne heslo zachyti spatne heslo
kdyz je vse spravne zustane na prihlaseni ale neprihlasise.

lookass
Člen | 54
+
0
-

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
+
0
-

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

David Grudl
Nette Core | 8129
+
0
-

Hrají v tom roli nějaké subdomény, https, proxy?

marcelxy
Člen | 70
+
0
-

ne je to bez https proxy bez subdomeny

Editoval marcelxy (14. 1. 2021 18:20)

Lumeriol
Generous Backer | 58
+
0
-

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
+
0
-

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)

marcelxy
Člen | 70
+
0
-

tak nakonec stacilo smazat v
session:
cookieDomain: ‚mojedomena‘
cookieSamesite: Lax
a uz se prihlasuje!
diky vsem za rady