Problém s polem rolí při přechodu na Nette3.x Exception Role ‚admin,superadmin‘ does not exist

Kyo
Člen | 4
+
0
-

Dobrý den,

po migraci na Nette 3.1 mám problém s více rolemi a vrací mi to Nette\InvalidStateException Role ‚admin,superadmin‘ does not exist.

Pokud je v DB uvedena pouze jedna role, např. superadmin, vše je v pořádku. Jakmile jsou ale role uvedeny dvě a více, obdržím zmíněnou exception.

Zkoušel jsem PHP verzi 7.2 i 7.4. Zkoušel jsem pole rolí uvádět v DB i ve formátu [admin,superadmin] nebo ['admin','superadmin'], také bez úspěchu.

Vypadá to, jako by funkce isAllowed neuměla rozdělit string z DB na jednotlivé role.

DB tabulka „users“ sloupec „role“
admin,superadmin

BasePresenter.php

if($this->user->isAllowed('crm', 'view'))  {...

common.neon

	- addRole('admin')
	- addRole('superadmin')
	- addResource('crm')
	- allow('admin', 'crm', [view])
	- allow('superadmin', 'crm', [view])

composer.json

		"nette/application": "^3.1",
		"nette/database": "^3.1",
		"nette/security": "^3.1",

Můžete mi, prosím, poradit, jak na to? Děkuji.

Editoval Kyo (22. 2. 2022 2:16)

Ozzrel
Generous Backer | 54
+
+3
-

Ahoj, no jestli vycházíš z Sandboxu tak tam to jde řešit asi tak v UserFacade.php řádek 65 kde se přidá explode()

return new Nette\Security\Identity($row[self::COLUMN_ID], explode(',',$row[self::COLUMN_ROLE]), $arr);

Nebo tak nějak podobně to bude i u tebe.

Kyo
Člen | 4
+
0
-

Děkuji! Skutečně to bylo tím explode, pomohlo to.

	public function authenticate(string $email, string $password): IIdentity
		{
		$row = $this->database->table('users')
			->where('email', $email)
			->fetch();

		if (!$row) {
			throw new Nette\Security\AuthenticationException('Nesprávně zadaný e-mail.');
		}

		if (!$this->passwords->verify($password, $row->password)) {
			throw new Nette\Security\AuthenticationException('Heslo není správné.');
		}

/* Původní kód
		return new Nette\Security\Identity(
			$row->id,
			$row->role), // or array of roles
			$row
		);
*/

/* Nový kód*/
		$arr = $row->toArray();
		unset($arr->password);
		return new Nette\Security\Identity($row->id, explode(',',$row->role), $arr);

	}

Editoval Kyo (22. 2. 2022 23:33)