Využití Nette pro autorizaci v externím php kódu
- xvh
- Člen | 3
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 | 6445
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
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 | 6445
- 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
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;
}
};