Využití Nette pro autorizaci v externím php kódu

xvh
Člen | 3
+
0
-

Zdravím,

ve svém projektu používám Nette a zároveň externí komponentu, která není založená na Nette. V této komponentě potřebuji implementovat funkci pro autorizaci uživatele. Momentálně dummy implementace vypadá takto:

$config['authentication'] = function () {
    session_start();
    return isset($_SESSION['file_access']) && $_SESSION['file_access'];
};

Rád bych využil konzistentní řešení se zbytkem Nette aplikace, jako třeba $user->isInRole('admin'). Nedaří se mi však dostat k identitě uživatele v Nette z externího php kódu (např. přes DI kontejner getByType atd.). Napadá někoho prosím elegantní řešení jak přistupovat k Nette z takového kódu?

Díky

David Matějka
Moderator | 6406
+
0
-

Ahoj, přistoupit přes DIC je správná cesta. co znamená, že se ti to nedaří? jak vypadá kód, kterým se o to pokoušíš? hlásí to nějakou chybu?

xvh
Člen | 3
+
0
-

Instance byla vždycky null. Jak jsem se to snažil popsat, tak mi došlo, kde je problém. Problém byl ve scope globálních a lokálních proměnných, předtím jsem tu instanci $user získával mimo funkci. Teď funkční kód vypadá takto:

$config['authentication'] = function () {
    $container = require __DIR__ . '/../../app/bootstrap.php';
    $user = $container->getByType(Nette\Security\User::class);
    return isset($user) && $user->isInRole('admin');
};

Bootstrap je implementovaný následujícím způsobem:

require __DIR__ . '/../vendor/autoload.php';

$configurator = new Nette\Configurator;
$configurator->enableDebugger(__DIR__ . '/../log');
$configurator->setTempDirectory(__DIR__ . '/../temp');

$configurator->createRobotLoader()
	->addDirectory(__DIR__)
	->register();

$configurator->addConfig(__DIR__ . '/config/config.neon');
$configurator->addConfig(__DIR__ . '/config/config.local.neon');

$container = $configurator->createContainer();
return $container;

Teď už to tedy nějak funguje, ale nejsem si úplně jistý, zda je to čisté řešení.

David Matějka
Moderator | 6406
+
0
-
  • to isset by nemělo být potřeba, pokud zavoláš getByType a ta služba neexstuje, měla by se vyhodit výjimka
  • opakované volání té funkce v $config['authentication'] bude znovu vytvářet container. bude lepší, když si ten container vytvoříš v globální scope
xvh
Člen | 3
+
0
-

Díky moc za rady. Předělal jsem to následujícím způsobem, funguje to dobře:

global $container;
$container = require __DIR__ . '/../../app/bootstrap.php';

$config['authentication'] = function () {
    global $container;
    try {
        $user = $container->getByType(Nette\Security\User::class);
        return $user->isInRole('admin');
    } catch (Nette\DI\MissingServiceException $e) {
        return false;
    }
};
CZechBoY
Člen | 3604
+
+2
-

pripadne pouzit use($container) namisto global v te funkci