Avatar
Dominik Gavrecký:

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ý <dominikgavrecky@icloud.com>
 * 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. července 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ý:

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

Nahoru Odpovědět 29. července 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ý:

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 1. srpna 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
Tým ITnetwork
Avatar
 
Nahoru Odpovědět  ±0 1. srpna 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.