kde spravne vlozit role a zdroje

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

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
+
0
-

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.

ali
Člen | 342
+
0
-

Do configu to dat nemohu (zapomel jsem zminit), nazvy roli a zdroju nacitam z databaze.. takze tovarnicku s timto doporucujes do Base Presenteru?

David Matějka
Moderator | 6445
+
+2
-

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
+
0
-

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
+
+2
-

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')) {

}
ali
Člen | 342
+
0
-

ten user me nanapadl, funguje to, diky moc!