přihlašování uživatelů – dvě databáze

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

Ahoj,
řeším problém s přihlašováním uživatelů pomocí dvou databází. Mám projekt, který využívá pro přihlašování tabulku uživatelů z jiného projektu. Databázový uživatel má přístup jen k té jedné tabulce v cizí databázi a pouze pro SELECT.
Teď se snažím to nějak „našroubovat“ dohromady, něco jsem už našel tady: https://forum.nette.org/…uhe-databazi, ale pořád nevím, jak na to…

config.local.neon:

nette:
	database:
		default:
			dsn: 'mysql:host=localhost;dbname=databaze1'
			user: uzivatel
			password:
			options:
				lazy: yes
			autowired: true

		dbconn2:
			dsn: 'mysql:host=localhost;dbname=databaze2'
			user: uzivatel
			password:
			autowired: false

Authenticator.php:

use Nette\Security as NS;

class Authenticator extends Nette\Object implements NS\IAuthenticator {

  public $connection;

  function __construct(Nette\Database\Context $connection){
  $this->connection = $connection;
  }


  public function authenticate(array $informations){
  list($username, $password) = $informations;
  $password = md5($password);

  // zeptá se v databázi 2 v tabulce visitors (uchovává seznam uživatelů). Ověří jméno a heslo.
  $row = $this->connection->table('visitors')->where('username = ? AND password = ?', $username, $password)->fetch();

  // pokračuje v dotazování - zjišťuje další údaje o uživateli, ale tentokrát v databázi 1:
  $data = $this->connection->table("users")->where("login = ?", $row->login)->fetch();

  // ...

  return new NS\Identity($row->id, $row->level, $row);
  }

SignPresenter.php:

/**
   * Zpracování přihlašovacího formuláře
   */
  public function signInFormSubmitted(Form $form){
  $values = $form->getValues();

    try {
		$values = $form->getValues();
		$this->getUser()->login($values->login, $values->password);
    $this->flashMessage('Byli jste úspěšně přihlášeni.', 'info');

		} catch (Nette\Security\AuthenticationException $e){
		$this->flashMessage($e->getMessage(), 'error');
		}

	$this->redirect('Homepage:default');
  }

Poradíte, prosím, jak na to? Co chybí / je potřeba udělat jinak? Děkuji předem…

David Matějka
Moderator | 6445
+
0
-

Do authenticatoru musis predat obe spojeni

public function __construct(Nette\Database\Context $connection1, Nette\Database\Context $connection2)
{
...
}

prvni se autowiruje spravne, druhe ale musis uvest:

services:
	- Authenticator(..., @nette.database.conn2.context) #ano, opravdu staceji ty tri tecky
Jan Endel
Člen | 1016
+
0
-

Ještě přidám poznámku, že druhému spojení je zapotřebí v neon souboru nastavit autowire: off.

David Matějka
Moderator | 6445
+
0
-

@Jan Endel: nemelo by to byt nutne https://api.nette.org/…ion.php.html#…

had12
Člen | 28
+
0
-

kluci moji, ono to funguje!!! :-) Díky, fakt mi to vytrhlo trn z paty…

Takže pokud to chápu správně, tak pokud bych někde potřeboval obě dvě připojení, pak stačí změnit konstruktor v tom modelu, aby se předávaly dva parametry jako připojení? To je fakt hustý…

Michal Vyšinský
Člen | 608
+
0
-

ano, ale ještě musíš změnit neon konfiguraci té služby, jelikož zde není možné použít autowire

Editoval Michal Vyšinský (10. 6. 2014 11:53)

Jan Endel
Člen | 1016
+
0
-

@matej21 :Cool, ten davídek taky myslel na věechno :-)