Vlastní autentifikátor po upgrade Nette
- Allconius
- Člen | 313
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
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
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
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
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ží…
- Kamil Valenta
- Člen | 762
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
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.