přihlašování uživatelů – dvě databáze
- had12
- Člen | 28
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
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
- David Matějka
- Moderator | 6445
@Jan Endel: nemelo by to byt nutne https://api.nette.org/…ion.php.html#…
- Michal Vyšinský
- Člen | 608
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)