kde spravne vlozit role a zdroje
- ali
- Člen | 342
Zdravim,
moje aplikace ma klasicky jeden zakladni UserManager, ktery se mi stara o prihlaseni uzivatele a prirazeni roli z databaze, ktera ma nastaveny. Pak dalsich nekolik presenteru a kazdy presenter ma prirazen svuj model (vsechny modely maji spolecneho predka tzv Base model, ktery se stara zatim jenom o pripojeni do databaze)
Moje otazka zni, kde spravne vlozit tyto radky prirazeni roli a zdroju?
...
$acl->addRole('guest');
...
$acl->addResource('article');
...
Pridavat role a zdroje do constructoru UserManageru, nebo do UserManageru az po uspesnem prihlaseni? Nebo do zakladniho Base modelu?
- besanek
- Člen | 128
Do base modelu ani UserManageru to rozhodně nepatří. Nejlepší je mít
třídu Nette\Security\Permission
jako službu a injektovat jí.
Buď v konfigu cca takto: https://doc.nette.org/…thentication#…
a nebo ještě lépe si napsat vlastní továrničku.
- David Matějka
- Moderator | 6445
tak si vytvor sluzbu, ktera ti acl nakonfiguruje a vytvori, nejak takhle:
class MyAclFactory
{
protected $database;
public function __construct(Nette\Database\Context $database)
{
$this->database = $database;
}
public function create()
{
$permission = new Nette\Security\Permission;
foreach($database->query("VYBER ACL PRAVIDLA :)") as $row) {
....
}
return $permission;
}
}
to registrujes jako sluzbu a permission si pomoci toho nechas vytvorit
services:
myAclFactory: MyAclFactory
authorizator:
class: Nette\Security\Permission
create: @myAclFactory::create()
- ali
- Člen | 342
Mateji diky!
Jen jeste mensi dotaz, zas tak moc zbehly v Nette nejsem, takze sem si vytvoril tovarnicku
<?php
/**
* --------------------
* /App/service/permission.php
* --------------------
*/
namespace Service;
use Nette,Config;
class Permission implements Config\BaseSettings
{
protected $db;
/**
* pripojeni k databazi
*/
public function __construct(\DibiConnection $database)
{
$this->db = $database;
}
/**
* vytvoreni roli a zdroju
*/
public function create()
{
$permission = new Nette\Security\Permission;
// pridani zdroju
forEach($this->db->query("SELECT * FROM %n",self::TABLE_RESOURCES)->fetchAll() as $resource)
$permission->addResource($resource["resource_name"]);
// pridani roli
forEach($this->db->query("SELECT * FROM %n",self::TABLE_ROLES)->fetchAll() as $role)
{
$permission->addRole($role["role_name"]);
// prirazeni povoleni zdroju pro jednotlive role
$allowArray = array();
forEach($this->db->query("SELECT %n.[role_id],%n.[resource_id],%n.[role_name],%n.[resource_name] FROM %n LEFT JOIN %n ON %n.[role_id]=%n.[role_id] LEFT JOIN %n ON %n.[resource_id]=%n.[resource_id] WHERE %n.[role_id]=%i",self::TABLE_ROLES_RESOURCES,self::TABLE_ROLES_RESOURCES,self::TABLE_ROLES,self::TABLE_RESOURCES,self::TABLE_ROLES_RESOURCES,self::TABLE_ROLES,self::TABLE_ROLES_RESOURCES,self::TABLE_ROLES,self::TABLE_RESOURCES,self::TABLE_ROLES_RESOURCES,self::TABLE_RESOURCES,self::TABLE_ROLES_RESOURCES,$role["role_id"])->fetchAll() as $allow)
$allowArray[] = $allow["resource_name"];
$permission->allow($role["role_name"],$allowArray);
}
return $permission;
}
}
?>
zaregistroval v configu
services:
- Service\Permission
permission:
class: Nette\Security\Permission
create: @Service\Permission::create()
ale netusim jak s tim tedka pracovat v presenteru, kdyz si tuto sluzbu injectuju, tak se mi provede zbytecne 2× a nepodarilo se mi nikde dohledat jak si injectnout jiz vytvorene data.
Editoval ali (21. 2. 2014 20:47)
- David Matějka
- Moderator | 6445
jses si jistej, ze se to provede 2x? ja myslim, ze ne :)
a ten autorizator ani injectovat nemusis, potrebne metody jsou dostupne na
tride Nette\Security\User,
tedy to, co je v presenteru v $this->user
. pro overeni muzes
tedy pouzivat
if($this->user->isAllowed('article', 'edit')) {
}