Zabezpečení přístupu ke komponentě
- Bogi
- Člen | 24
Jaký je nejjednodušší a čistý způsob zabezpečení komponenty, aby byla přístupná jen uživatelům s administrátorskými právy?
Presenter řeší požadavky od všech typů uživatelů (admin i obyč. uživatel). Lze třeba nějakým způsobem svázat komponentu pouze s určitou akcí na presenteru?
Pokud jsem to pochopil správně, komponenta je nějakým způsobem přístupná ze všech akcí v presenteru. Takže pokud třeba ošetřím nějakou konkrétní renderStránku(), která komponentu používá, není to dostatečné. Prošel jsem různé staré vlákna v diskusi, ale řešení pro tak jednoduchý problém se mi zdají příliš složitá.
Příklad kódu s komponentou pro Ublaboo DataGrid. View EditUsers má umožnit pouze adminovi editovat ostatní uživatele:
<?php
namespace App\AdminModule\Presenters;
use Nette;
class UserPresenter extends BasePresenter
{
/** @var Nette\Database\Context */
public $db;
function __construct(Nette\Database\Context $db)
{
parent::__construct();
$this->db = $db;
}
// Pristupne pouze s admin pravy, ve view se pouziva komponenta UsersDatagrid
public function renderEditUsers()
{
// Only admin can diplay the page
$user = $this->getUser();
if (!$user->isInRole('admin')) { // User is not admin
$this->flashMessage('Nemáte dostatečná oprávnění.');
$this->redirect('Overview:default');
}
}
// Melo by byt pristupne pouze s admin pravy
protected function createComponentUsersDatagrid($name)
{
$grid = new \Ublaboo\DataGrid\DataGrid($this, $name);
$grid->setDataSource($this->db->table('users'));
// dalsi kod komponenty...
}
// dalsi rendrovaci metody pro view, ktere jsou pro obyc. uzivatele i adminy
public function renderDefault()
{
}
}
- srigi
- Nette Blogger | 558
Kedze Ublaboo\DataGrid
je kod „zvonka“, do ktoreho by si
nemal zasahovat, jednoduche riesenie vidim takto: sprav si nejaku „Null“
komponentu, ktora iba renderuje prazdy string napr. A potom iba uprav
tovarnicku.
protected function createComponentUsersDatagrid($name)
{
if ($user->isInRole('admin')) {
$control = new \Ublaboo\DataGrid\DataGrid($this, $name);
$control->setDataSource($this->db->table('users'));
// dalsi kod komponenty...
} else {
$control = new App\NullComponent();
}
return $control;
}
Editoval srigi (11. 8. 2016 17:24)