IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Dominik Gavrecký:29.7.2016 3:31

Ahojte,

po nekonečných hodinách trápenia by som vás vážne chcel poprosiť o pomoc. Tvorím dynamické ACL ale vznikol mi dosť zvláštny problém.

AuthorizatorFac­tory:

<?php
namespace App\Security;

use App\Model\PermissionsManager;
use Nette;
use Nette\Security\Permission;

/**
 * @package App\Security
 */
class AuthorizatorFactory extends Nette\Object
{
    /**
     * Konstanty role
     */
    const ROLE_GUEST = 'guest';
    const ROLE_USER = 'user';

    /** @var PermissionsManager */
    public $permissionsManager;

    /**
     * AuthorizatorFactory constructor.
     * @param PermissionsManager $permissionsManager Automaticky injektovaná instace triedy modelu pre prácu s právami.
     */
    public function __construct(PermissionsManager $permissionsManager)
    {
        $this->permissionsManager = $permissionsManager;
    }

    /**
     * @return Permission
     */
    public function create()
    {
        $acl = new Permission;

        $roles = $this->permissionsManager->getRoles();

        /**
         * Roles
         */
        $acl->addRole(self::ROLE_GUEST);
        $acl->addRole(self::ROLE_USER, self::ROLE_GUEST);
        foreach ($roles as $role) {
            $acl->addRole($role->role, self::ROLE_USER);
        }

        /**
         * Resoures
         */
        /* Admin Module Main */
        $acl->addResource('Admin');
        $acl->addResource('Admin:News', 'Admin');
        $acl->addResource('Admin:Contact', 'Admin');
        $acl->addResource('Admin:Forum', 'Admin');
        $acl->addResource('Admin:Servers', 'Admin');
        $acl->addResource('Admin:Homepage', 'Admin');

        /* Front Module Main */
        $acl->addResource('Front');
        $acl->addResource('Front:News', 'Front');
        $acl->addResource('Front:Homepage', 'Front');

        /**
         * Permissions
         */
        $acl->allow(self::ROLE_GUEST, 'Front');

        foreach ($roles as $perm) {
            $acl->allow($perm->role, explode(",", $perm->resource), explode(",", $perm->allow));
        }

        return $acl;
    }

}

BasePresenter:

/**
     * @param $element
     * @throws ForbiddenRequestException
     */
    public function checkRequirements($element)
    {
        $secured = $element->hasAnnotation('Secured');
        $resource = $this->name;

        if ($this->action == 'default') {
            $action = "read";
        } else {
            $action = $this->action;
        }
        if ($secured == TRUE) {
            if (!$this->user->isAllowed($resource, $action)) {
                throw new ForbiddenRequestException();
            }
        }

    }

NewsPresenter

<?php

namespace App\FrontModule\Presenters;

use App\Model\NewsManager;
use Nette\Application\BadRequestException;
use Nette\Application\UI\Form;
use Nette\Security\Identity;
use Tracy\Debugger;


/**
 * Class NewsPresenter
 * @Secured
 * @package App\FrontModule\Presenters
 * @author  Dominik Gavrecký <[email protected]>
 * Presenter/Model na správu XXX
 */
class NewsPresenter extends BasePresenter
{
...

A teraz k popisu môjho problému. Snažím sa hodiť do template Default podmienku ktorá by mala zabezpečiť to že ak má užívateľ práva na edit alebo delete tak zobrazí odkaz, ale prejde len prvá podmienka druhá je síce TRUE (súdim podľa dumpu) ale vždy je TRUE aj ak ju daná rola nemá priradenú. V permissionsManager mám len klasický fetchAll().

{if $user->isLoggedIn()}
        {if $user->isAllowed('Front:News', 'edit') == TRUE}
                <a href="#"><i class="fa fa-pencil"></i>Upraviť</a>
        {/if}

        {if $user->isAllowed('Front:News', 'delete') == TRUE}
           <a href=""><i class="fa fa-times"></i>Vymazať</a>
       {/if}
{/if}

Ak by vám to pripadalo nejaké chaotické alebo niečo len sa pýtajte ja už si vážne neviem pomôcť.

Odpovědět
29.7.2016 3:31
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
Dominik Gavrecký:29.7.2016 18:35

Skúšal som to aj na pevno bez DB a tiež to nefunguje a neviem prísť na chybu.

Nahoru Odpovědět
29.7.2016 18:35
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
Dominik Gavrecký:1.8.2016 15:41

Problém bol v dedičnosti

$acl->allow(self::ROLE_GUEST, 'Front');

Neuvedomil som si že guest dostal automaticky všetky actions práva.

Akceptované řešení
+5 Zkušeností
Řešení problému
Nahoru Odpovědět
1.8.2016 15:41
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
Jindřich Máca
Tvůrce
Avatar
Odpovídá na Dominik Gavrecký
Jindřich Máca:1.8.2016 15:54

Co jsem Ti říkal... :D

 
Nahoru Odpovědět
1.8.2016 15:54
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.