Vlastní autentifikátor po upgrade Nette

Allconius
Člen | 313
+
0
-

Ahoj, po vytvoření nového projektu přes composer (Nette 3.1.14, PHP 8.2) mi phpstorm u Autenticatoru hlásí:

Cannot inherit previously-inherited or override constant 'IDENTITY_NOT_FOUND' from interface 'IAuthenticator'
Cannot inherit previously-inherited or override constant 'INVALID_CREDENTIAL' from interface 'IAuthenticator'
Cannot inherit previously-inherited or override constant 'FAILURE' from interface 'IAuthenticator'
Cannot inherit previously-inherited or override constant 'NOT_APPROVED' from interface 'IAuthenticator'

Používám SimpleIdentity takto:

namespace App\Auth;

use Nette;
use Nette\Security\SimpleIdentity;


class Authenticator implements Nette\Security\Authenticator
{
    public function __construct(
        private array $config,
        private Nette\Database\Explorer $database,
        private Nette\Security\Passwords $passwords)
    {

    }

    public function authenticate(string $username, string $password): SimpleIdentity
    {

vypadá to že vše funguje, nevadí že se nedědí ty konstanty ?

Infanticide0
Člen | 64
+
0
-

Tyhle upper case konstanty jsou deprecated a Nette Application je už nejspíš vůbec nepoužívá.

	/** @deprecated use Authenticator::IdentityNotFound */
	public const IDENTITY_NOT_FOUND = self::IdentityNotFound;

	/** @deprecated use Authenticator::InvalidCredential */
	public const INVALID_CREDENTIAL = self::InvalidCredential;

	/** @deprecated use Authenticator::Failure */
	public const FAILURE = self::Failure;

	/** @deprecated use Authenticator::NotApproved */
	public const NOT_APPROVED = self::NotApproved;
	/** Exception error code */
	public const
		IdentityNotFound = 1,
		InvalidCredential = 2,
		Failure = 3,
		NotApproved = 4;
Allconius
Člen | 313
+
0
-

Ahoj, díky nechal jsem to zatím tak. Můžu nějak v tom autentikátoru nastavit co se stane po vypršení přihlášení ? Mám přihlášení zpracované takto:


    public function signInFormSucceeded(Form $formSignIn)
    {
        $values = $formSignIn->getValues();
        try {
            $user = $this->user;
            $user->setAuthenticator($this->authenticator);
            $user->setExpiration('90 minutes');
            $user->login($values->username, $values->password);
            $id = $this->user->getIdentity()->id;
            $this->insertLog($id, 'Base', 'login',0, $this->httpRequest->getRemoteAddress());
            $this->redirect('this');
        } catch (Nette\Security\AuthenticationException $e) {
            $formSignIn->addError('Nesprávné přihlašovací jméno nebo heslo.');
            $this->flashMessage('Neplatné přihlašovací jméno nebo heslo.', 'warning');
        }
    }

jde mi o to jak při odhlášení nastavit nějaký redirect na úvodní stránku, stává se mi že mě to odhlásí v backendu aplikace a nepoznám že už jsem odhlášený.

Editoval Allconius (5. 3. 11:56)

Infanticide0
Člen | 64
+
+1
-

Předpokládám, že někde kontroluješ aktivní přihlášení – obvykle v BasePresenter::startup() modulu.

protected function startup()
{
	parent::startup();
	if (!$this->getUser()->isLoggedIn()) {
		$this->redirect('Sign:in');
	}
}

Zároveň ne nutně, spíš podle potřeby uživatelů, bys mohl přidat restoreRequest k tomu odhlášení.
https://doc.nette.org/…tore-request

Allconius
Člen | 313
+
0
-

Ahoj, mám tam funkci:

    protected function startup()
    {
        parent::startup();

        $this->createAccess('Admin','default', 'profile', '', 1);

    protected function createAccess($pres, $lay, $res='', $priv='', $admin=0)
    {
        if ($admin==1){
            if ($this->getUser()->isLoggedIn()) {
                $user = $this->getUser()->getIdentity()->id;
                if (!$this->isAllowed($user, $res, $priv)) {
                    $this->redirect('Home:');
                }
            }else{
                $this->redirect('Home:');
            }
        }
    }

ale jde mi o to že když mi na stránce zůstane třeba otevřené modální okno s formulářem a mezitím mě to odhlásí tak se to redirectne až po odeslání toho formu nebo refreshem stránky, takže někdo tam třeba může něco naťukat co se mu pak neuloží…

Pepino
Člen | 249
+
0
-

@Allconius To co chceš jde udělat jedině tak, že budeš ajaxem co pár sekund kontrolovat jestli je uživatel stále přihlášený a pokud není tak pomocí JS přesměrovat..

A ohledně neuložení rozpracovaného formuláře, jak už někdo psal výše, storeRequest a restoreRequest.

Kamil Valenta
Člen | 762
+
0
-

Pepino napsal(a):

@Allconius To co chceš jde udělat jedině tak, že budeš ajaxem co pár sekund kontrolovat jestli je uživatel stále přihlášený a pokud není tak pomocí JS přesměrovat..

Proč „co pár sekund“? Proč si nepočítat na client-side time limit podle expirace session a při libovolném ajaxu ho vynulovat?

Ťukat kvůli tomu do backendu co pár vteřin bude při větším počtu uživatelů docela síla…

Pavel Kravčík
Člen | 1182
+
0
-

Záleží, co to je za formulář. Ale spousta například WYSIWYG má například funkci na průběžné ukládání delších textarea a při opětovném přihlášení tam dokážou doplnit data. To si samozřejmě můžeš udělat a například ty data serializovat do session.