problém se zaregistrováním autorizátoru a použitím v layout.latte
- luban
- Člen | 3
Zdravím, mám problém se zaregistrováním autorizátoru pro přihlášeného uživatele. Pokud po nastavení autorizátoru použiju v presenteru metodu $this->getUser()->isAllowed(‚objednavka‘,‚zobrazit‘) ⇒ vrátí správně true (podle nastavených práv). Pokud ale použiju stejnou metodu, tedy $user->isAllowed(‚objednavka‘, ‚zobrazit‘), v layout.latte, tracy vyhodí chybu „Authorizator has not been set.“
Kód vypadá zhruba takto:
Autentizace (ta proběhne bez problémů) a autorizace probíhá v SignPresenter:
<?php
...
class SignPresenter extends BasePresenter
{
protected $authorizationManager;
public function startup() {
parent::startup();
$this->authorizationManager = $this->context->getService('AuthorizationManager');
}
...
public function signInFormSucceeded($form, $values)
{
if ($values->zapamatovat) {
$this->getUser()->setExpiration('14 days', FALSE);
} else {
$this->getUser()->setExpiration('20 minutes', TRUE);
}
try {
$this->getUser()->login($values->login, $values->heslo);
$acl = $this->authorizationManager->getPermission();
$this->getUser()->setAuthorizator($acl);
if($this->getUser()->isAllowed("objednavka","zobrazit")){
//tohle je pouze testování návratové hodnoty - mám problém s rozchozením debbugeru
$this->redirect(':Order:Order:default');
}else{
//tohle je pouze testování návratové hodnoty - mám problém s rozchozením debbugeru
$this->redirect('Homepage:');
}
} catch (Nette\Security\AuthenticationException $e) {
$form->addError($e->getMessage());
}
}
}
?>
Práva se berou z třídy AuthorizationManager, která je registrovaná jako služba v config.neon:
<?php
class AuthorizationManager extends \Nette\Object {
/** @var Nette\Database\Context */
private $database;
private $acl;
public function __construct(Nette\Database\Context $database) {
$this->database = $database;
$this->acl = new Nette\Security\Permission;
}
public function getPermission(){
//testovací práva
$this->acl->addRole("admin");
$this->acl->addResource("objednavka");
$this->acl->addResource("uzivatel");
$this->acl->allow("admin", "objednavka", "zobrazit");
$this->acl->deny("admin", "uzivatel", "zobrazit");
return $this->acl;
}
}
?>
V config.neon:
services:
- App\Model\UserManager
- App\RouterFactory
BaseModel: App\Model\BaseModel
AuthorizationManager: App\Model\AuthorizationManager
router: @App\RouterFactory::createRouter
Chyba nastává v layout.latte po přihlášení:
{if $user->isAllowed('objednavka', 'zobrazit')}
Objednavka
{/if}
Předpokládal jsem, že stránka by se měla vykreslit až po proběhnutí
metody signInFormSucceeded v SignPresenteru ⇒ i po nastavení autorizátoru
pomocí metody setAuthorizator()… nevím jestli je chyba v tomto nebo
s předáním objektu Nette\Security\Permission do „globální“ proměnné
$user, nebo ještě někde jinde.
V nette jsem začátečník, takže budu rád za každou radu a
poučení! :-)
- David Matějka
- Moderator | 6445
registruj autorizator vytvoreny tim authorization managerem jako sluzbu, do neonu pridej:
services:
-
class: Nette\Security\IAuhtorizator
create: @AuthorizationManager::getPermission
tim se autorizator automaticky sparuje s userem, takze muzes smazat
$this->getUser()->setAuthorizator($acl);
a souvisejici radky
- luban
- Člen | 3
Práva ale nebudou vždy statická, jak je v příkladu. Budu je tahat z databáze a budou se moct lišit uživatel od uživatele.
Jednodušeji, budu potřebovat do AuthorizationManager předávat id přihlášeného uživatele a podle toho nastavovat práva pomocí metod Nette\Security\Permission.
To tímhle způsobem asi nedokážu… nebo jestli jsem to špatně pochopil, tak mi to prosím zkus vysvětlit víc polopatě. (Hold se začátečníkama je to těžký :-) )
Díky
- luban
- Člen | 3
Zkusil jsem zaregistrovat autorizátor v tom config.neon, ale stejně to nefunguje. Teď se vyhodí chyba Role ‚admin‘ does not exist při získání práv přes metodu isAllowed hned v presenteru.
Protože tomu configu moc nerozumím, zkusím se zeptat:
- jak se sparuje autorizator s userem?
- kde se předá useru instance třídy Nette\Security\Permission() z funkce getPermission (tady je definovaná role admin)
- ještě k předchozímu dotazu – proč se funkcí setAuthorizator() nenastaví instance Nette\Security\Permission() napořád? Vždyť z presenteru přes $this->user a v latte přes $user přistupuju k jedné a té samé proměnné ne?
Kdyby mi ještě někdo mohl jednoduše popsat, jak jednoduše rozchodit acl, byl bych vděčný, už jsem se v tom totálně ztratil a ani nikde na foru nemůžu najít nic co by mi pomohlo…
Editoval luban (7. 10. 2014 15:42)
- jarekp
- Člen | 2
luban napsal(a):
Zkusil jsem zaregistrovat autorizátor v tom config.neon, ale stejně to nefunguje. Teď se vyhodí chyba Role ‚admin‘ does not exist při získání práv přes metodu isAllowed hned v presenteru.
Protože tomu configu moc nerozumím, zkusím se zeptat:
- jak se sparuje autorizator s userem?
- kde se předá useru instance třídy Nette\Security\Permission() z funkce getPermission (tady je definovaná role admin)
- ještě k předchozímu dotazu – proč se funkcí setAuthorizator() nenastaví instance Nette\Security\Permission() napořád? Vždyť z presenteru přes $this->user a v latte přes $user přistupuju k jedné a té samé proměnné ne?
Kdyby mi ještě někdo mohl jednoduše popsat, jak jednoduše rozchodit acl, byl bych vděčný, už jsem se v tom totálně ztratil a ani nikde na foru nemůžu najít nic co by mi pomohlo…
Našel jsi nějaké řešení? Případně nevěděl by někdo, co s tím? Mám totiž podobný problém.
- Jan Mikeš
- Člen | 771
Vzdyt tam je jasne napsano co je za chybu.
Nemas definovanou roli „admin“ ve sve instanci
Nette\Security\Permission
a zaroven se nekde dotazujes zdali ma
uzivatel danou roli.
V tride Nette\Security\Permission
si nejdrive musis nadefinovat
veskere role a resources, az pak s nimi muzes pracovat