ACL z databaze nieje dostupna cez $this->user->isAllowed()

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

ahojte, snazim sa sprevadzkovat ACL, ktore nacita data z databazi:

<?php

namespace App\Model;

use Nette\Security\Permission,
    Nette\Security\IAuthorizator;


class AuthorizatorControl extends \Nette\Object{


    /** @var Nette\Database\Context */
    private $database;
    private $permission;
    private $user;

    public function __construct(\Nette\Database\Context $database, \Nette\Security\User $user) {
        $this->database = $database;
        $this->user = $user;

        $permission  = new Permission;


        //set roles
        $roles = $this->database->table('nette_roles')->fetchAll();
        if(count($roles) > 0){
            foreach($roles as $role){
                $permission->addRole((string)$role->role_id);
            }
        }

        //set resources and allow
        $resources = $this->database->table('nette_permissions')->group('permission_name')->fetchAll();
        if(count($resources) > 0){
            foreach($resources as $resource){
                $permission->addResource((string)$resource->permission_name);
            }
        }

        $allows = $this->database->table('nette_permissions')->fetchAll();
        if(count($allows) > 0){
            foreach($allows as $allow){
                $permission->allow((string)$allow->role_id, (string)$allow->permission_name, json_decode($allow->allowed));
            }
        }
        $this->permission = $permission;


    }
    public function isAllowed($resource, $action){
        return $this->permission->isAllowed((string)$this->user->getIdentity()->role_id, (string)$resource, (string)$action);
    }


}

v config.neon mam:

services:
        - App\Model\UserManager
        - App\components\IMenuFactory
        - App\components\IUserAccountFactory
        - App\Model\Categories
        - App\Model\Locate
        - App\Model\AuthorizatorControl #ACL

a v basePresenter.php mam:

/** @var Acl */
    protected $acl;
public function injectAuthorizator(Model\AuthorizatorControl $authorizator)
    {
        $this->acl = $authorizator;
    }

problem je, ze to v presenteroch viem pouzivat iba takto:

if($this->acl->isAllowed('admin.articles', 'delete') == TRUE){

teraz pouzivam na overovanie:

 if($this->acl->isAllowed('admin.articles', 'delete') == TRUE){
   //kod
}

/*toto nefunguje ked pouzijem $this->user object:*/
/*
 if($this->user->isAllowed('admin.articles', 'delete') == TRUE){...}
*/

viete mi prosim poradit, ako by som to vedel sprevadzkovat, aby som pouzival aj samostatne user object a nemusel sa odvolavat na premennu $this->acl?
dakujem

enumag
Člen | 2118
+
+2
-

V tvém případě by to sice šlo opravit poměrně snadno, ale přesto ti doporučím nechat to jak to máš a odvolávat se přímo na $this->acl. Třída User je v některých směrech dost nešikovná a na složitější ACL je tvůj způsob mnohem lepší. Navíc v budoucnu něco na tento způsob bude nejspíše best-practice.

stewestw
Člen | 42
+
0
-

dakujem za radu :) budem to teda takto pouzivat.