Zabezpečení přístupu ke komponentě

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

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
+
+2
-

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)