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
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
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.