Problém připojení do špatné DB

johnny13
Člen | 17
+
0
-

Ahoj, mám následující situaci:

Zavolám URL z prohlížeče s parametrem ‚hash‘, což je parametr rozlišující, ke kterému zákazníkovi (databázi) se má aplikace připojit. V bootstrapu se nejprve vytvoří DI container, poté na základě containeru se vytvoří DB spojení do databáze, ve které se získá host, port atd. dle hashe. Dále na základě těchto získaných údajů vytvořím DB spojení do zákazníkovi databáze a přidám jako službu do containeru a dále ji v modelu využívám. V NEONU mám nakonfigurovanou výchozí databázi, která se používá v případě neaktivního spojení do zákazníkovi DB. Pokud z prohlížeče vyplním přihlašovací údaje (email, heslo), tak je vše v pořádku, aplikaci se připojí ke správné DB a nadále se s tímto připojením pracuje.
Problém nastává ve chvíli, kdy přihlašovací formulář odešlu pomocí POSTMANA jako POST požadavek. Všechno se tváří stejně až do chvíle, když se má zjišťovat, zda daný uživatel existuje v DB. Problém tkví v tom, že místo toho, aby se použilo spojení do zákazníkovi databáze vytvářené v bootstrap.php, se použije spojení do výchozí databáze definované v neonu a tedy daný uživatel není dohledán.

V čem by mohl prosím být rozdíl přístupu přes prohlížeč oproti přístupu odeslání formuláře přes POSTMANA? Používám Nette 2.3.8, PHP 5.5, DB PostrgreSQL. Žádná chyba není hlášena. Pro práci s DB používám Nette\Database.

Děkuji.

bootstrap.php

<?php

/**
 * Vrátí spojení do databáze, která obsahuje připojovací údaje k zákazníkům
 *
 * @return \Nette\Database\Context
 */
function getDatabaseConnection() {
	$conn = new Nette\Database\Connection("pgsql:dbname=zakaznici;host=host123;port=10500;user=userxyz;password=hesloxyz;");

	$cacheStorage = new \Nette\Caching\Storages\FileStorage(__DIR__ . '/../temp');
	$structure = new \Nette\Database\Structure($conn, $cacheStorage);

	return new Nette\Database\Context($conn, $structure);
}

require __DIR__ . '/../vendor/autoload.php';

$configurator = new Nette\Configurator;
$configurator->setDebugMode(true);
$configurator->enableDebugger(__DIR__ . '/../log');

$configurator->setTempDirectory(__DIR__ . '/../temp');
$configurator->createRobotLoader()->addDirectory(APP_DIR)->addDirectory(LIBS_DIR)->register();

$configurator->addConfig(__DIR__ . '/config/config.neon', Nette\Configurator::AUTO);
$configurator->addConfig(__DIR__ . '/config/config.local.neon');

$container = $configurator->createContainer();

// v případě existujícího parametru hashe (tzn. uživatel se chce přihlásit) se získají přístupové údaje do zákazníkovy DB
if (isset($_GET["hash"])) {
	$db = getDatabaseConnection();
	$result = $db->query("SELECT ip, port FROM zakaznici WHERE hash = ?", $_GET["hash"])->fetch();

	$newTargetSchool = $container->getService("session")->getSection("targetSchool");

	$newTargetSchool["hash"] = $_GET["hash"];
	$newTargetSchool["ip"] = $result["ip"];
	$newTargetSchool["port"] = $result["port"];
}

// ze session se získají přístupové údaje k databázi zákazníka
$targetSchool = $container->getService("session")->getSection("targetSchool");

if ($targetSchool["hash"] == null) {
	$hash = $targetSchool["hash"];

	$db = getDatabaseConnection();
	$result = $db->query("SELECT ip, port FROM zakaznici WHERE hash = ?", $hash)->fetch();

	if ($result) {
		$targetSchool["ip"] = $result->ip;
		$targetSchool["port"] = $result->port;
		$targetSchool["hash"] = $hash;
	}
}

$conn = new Nette\Database\Connection("pgsql:host=" . $targetSchool["ip"] . ";port=" . $targetSchool["port"] . ";dbname=zakaznikovadb", "myusername", "najakeheslo");
$cacheStorage = new \Nette\Caching\Storages\FileStorage(__DIR__ . '/../temp/cache');
$structure = new \Nette\Database\Structure($conn, $cacheStorage);
$db = new Nette\Database\Context($conn, $structure);

$container->addService("nette.database.default", $db);

$container->application->run();
?>

config.neon

common:

	parameters:
		# is used, when connection setting in bootstrap is not active
		database:
			host: 111.111.111.111
			dbname: mydbname
			user: myusername
			password: mypassword
	php:
		date.timezone: Europe/Prague

	nette:
		session:
			autoStart: true
			expiration: "+ 7 days"
			savePath: "%tempDir%/sessions"

		database:
			default:
				dsn: 'pgsql:host=%database.host%;dbname=%database.dbname%'
				user: %database.user%
				password: %database.password%
				options:
					lazy: true
			svn:
				dsn: "pgsql:dbname=zakaznici;host=host123;port=10500;"
				user: userxyz
				password: hesloxyz
				options:
					lazy: true

		container:
			debugger: true
			accessors: TRUE

	latte:
		xhtml: no
	services:
		- Api(@database.svn.context)
		userManager: \Model\Permission\UserManager

		authenticator:
			class: \Model\Authenticators\MultiAuthenticator
			setup:
				- addAuthenticator("db", \Authenticator())
				- addAuthenticator("google", \Model\Authenticators\GoogleAuthenticator(@session, @userManager, @googleClient, false))
				- addAuthenticator("facebook", \Model\Authenticators\FacebookAuthenticator(@session, @userManager, @\Kdyby\Facebook\Facebook, false))

		authorizator:
			class: Authorizator

		studentInfo:
			class: StudentInfo(@container)

		teacherInfo:
			class: TeacherInfo(@container)

		schoolService:
			class: SchoolService(@container)

		versionService:
			class: VersionService(@container)

production < common:


development < common:

Abtraktní třída Service.php, jež dědí repozitáře pracující s databází přes proměnnou $database

<?php

/**
 * Class Service
 */
abstract class Service extends Nette\Object {

	/** @var Nette\DI\Container */
	protected $context;

	/** @var \Nette\Database\Context */
	protected $database;

	/**
	 * Create model class
	 */
	public function __construct(\Nette\DI\Container $context) {
		$this->context = $context;
		$this->database = $this->getService('nette.database.default');
	}

	/**
	 * 	Return service by name.
	 *
	 * @param string $name Name of the service
	 * @return mixed Service
	 */
	protected function getService($name) {
		return $this->context->getService($name);
	}

}
?>
David Matějka
Moderator | 6445
+
0
-

zkus to implementovat nejak takto

nightfish
Člen | 518
+
+1
-

johnny13 napsal(a):
Problém nastává ve chvíli, kdy přihlašovací formulář odešlu pomocí POSTMANA jako POST požadavek.
if (isset($_GET[„hash“])) {

Úplně detailně jsem to nestudoval, ale není problém v tom, že POST požadavek neprojde přes GET podmínku if (isset($_GET["hash"])) {?

johnny13
Člen | 17
+
0
-

Děkuji moc za rady pánové :) @nightfish Máš pravdu, sypu popel na hlavu. Děkuji

CZechBoY
Člen | 3608
+
0
-

Klidně může projít pokud dáš hash do querystringu.