Autentizace/autorizace v modularní aplikaci

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
richie
Člen | 1
+
0
-

zdravim.. potřeboval bych poradit ohledně přihlašování a autorizace v aplikaci, která je rozdělena do modulů Admin a Front. Chci se přihlašovat do každého modulu odděleně (každý modul má svůj speciální autentizátor).
Celá app: https://github.com/…e/master/app

Autentizaci mám řešenou takto:

/app/config/config.neon

services:
    security.frontAuthenticator: App\FrontModule\Components\FrontAuthenticator
    security.adminAuthenticator: App\AdminModule\Components\AdminAuthenticator

app\AdminModule\components\AdminAuthenticator.php

<?php
public function login($form, $instructions, $register = false)
{
...
    $username = $form->getValues()->user_name;
    $password = $form->getValues()->pass;
    $this->user->getStorage()->setNamespace('Admin');
    $this->user->login(new Security\Identity($row[self::COLUMN_ID], $this->roleManager->getRolesByUser($row[self::COLUMN_ID], 'Admin')->fetchPairs('role_id', 'role_title'), $arr));
...
}
?>

app\AdminModule\presenters\AdminBasePresenter.php

<?php
abstract class AdminBasePresenter extends BasePresenter
{
...
    protected function startup()
    {
        parent::startup();
        $this->user = parent::getUser();
        $this->user->getStorage()->setNamespace('Admin');
    }
...
}
?>

Stejným způsobem mám řešený front modul..

Autorizaci mám společnou pro oba moduly.
/app/config/config.neon

services:
    security.authorizatorFactory: App\Components\Authorizator
    security.authorizator: @security.authorizatorFactory::create

app\components\Authorizator.php

<?php
public function create()
{
    //userStorage je instance IUserStorage
    $identity = $this->userStorage->getIdentity();
    //dump($identity);exit;
    $permission = new Permission();

    if(!$identity)
        return $permission;
    # ROLES
    ...
    # RESOURCES
    ...
    # ACL
	...
    return $permission;
}
?>

Problém je v tom, že pokud nastavím namespace při přihlášení, v autorizátoru mi tato metoda vrací null:

$this-›userStorage-›getIdentity()

..když to nastavení namespace při přihlašování (a v basePresenterech) zakomentuju, pak mi ta metoda normálně vrací identitu přihlášeného uživatele.
Role a následně jejich zdroje a oprávnění chci v autorizátoru vytvářet na základě přihlášeného uživatele, tak se tam bez té identity neobejdu. Taky by se hodilo nějak získat v autorizátoru namespace modulu, z kterého přišel požadavek na autorizaci. Nevěděl by prosím někdo co s tím?

Editoval richie (24. 6. 2016 17:17)

enumag
Člen | 2118
+
0
-

Bohužel v Nette/Security je tohle dost neohrabané. Řeším to pomocí knihovny kterou jsem si před nějakou dobou napsal. Bohužel jsem ji dal na GitHub až před pár dny (když jsem odpovídal tady) takže nemá dokumentaci.