Prazdna stranka po zavolani loginu

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

Dobry den.

Vcera som si na roote zacal citat serial o tomto frameworku a rozhodol som sa, ze ho v niektorych projektoch zacnem pouzivat.

Pre ziskanie skusenosti som si povedal, ze si vytvorim vlastny login form a pomocou nette sa prihlasim do admin rozhrania. (admin.php)

Form vyzera takto:

<?php

switch($_GET["action"])
  {
    case "login":
      include("login.php");
    break;
  }

$form = new Form;
$form ->addText('name','ID: ');
$form ->addPassword('pass','password: ');
$form ->getElementPrototype()->action('index.php?action=login');
$form ->addSubmit('login', 'login');

echo $form;

?>

a jeho spracovanie

login.php:

<?php

require '../framewrks/nette/Nette/loader.php';
require 'auth.php';

$username = $_POST["name"];
$password = $_POST["pass"];

$user = Environment::getUser();

$user->setAuthenticationHandler(new MyAuthenticator);

$user->setExpiration('+ 15 minutes');

try {
        $user->authenticate($username, $password);
        Environment::getHttpResponse()->redirect('admin.php');

} catch (AuthenticationException $e) {
        echo 'Chyba: ', $e->getMessage();
}

echo $user->isAuthenticated() ? 'ano' : 'nie'

?>

auth.php:

<?php

class MyAuthenticator extends Object implements IAuthenticator
{

    public function authenticate(array $credentials)
    {
        $username = $credentials[self::USERNAME];
        $password = sha1($credentials[self::PASSWORD] . $credentials[self::USERNAME]);

        $row = dibi::fetch('SELECT id, pass FROM kuserz WHERE login=%s', $username);

        if (!$row) {
            throw new AuthenticationException("User '$username' not found.", self::IDENTITY_NOT_FOUND);
        }

        if ($row->password !== $password) {
            throw new AuthenticationException("Invalid password.", self::INVALID_CREDENTIAL);
        }

        return new Identity($row->id);
    }

}

?>

Problem je, ze vzdy po odoslani formulara sa objavi prazdna stranka index.php?action=login so ziadnym vypisom.
Bez ohladu na to, ci som nieco do formulara napisal/nenapisal, alebo napisal nespravne.

Je mozne za mi unika iba malickost, alebo som nieco nespravne pochopil, ale ako hovorim zacal som iba vcera, no nette sa mi paci a rad by som v nom pokracoval dalej.

Dakujem za pomoc. :)

_Martin_
Generous Backer | 679
+
0
-

Ahoj, tak tedy:

  1. Zapni si Laděnku příkazem Debug::enable();, který umístíš hned za načtení frameworku – možná je zde nějaká výjimka nebo i noticka (které máš zjevně vypnuté, jinak bys věděl, že switch($_GET["action"]) může být přístup k nedefinované proměnné).
  2. Přepracuj kód tak, aby se přihlašování vykonávalo až po odeslání formuláře (v tvém případě by se aplikace pokusila přihlašovat i při prázdném formuláři) a aby jsi vůbec formulář používal na ošetření zadávaných dat (použitím $username = $_POST["name"]; jsi Nette formuláře degradoval na pouhé vypsání XHTML kódu).
$form = new Form;
$form ->addText('name','ID: ');
$form ->addPassword('pass','password: ');
$form ->getElementPrototype()->action('?action=login');
$form ->addSubmit('login', 'login');

// jestliže byl formulář odeslán
if ($form->isSubmitted()) {
    // a jestliže jsou všechny položky vyplněny správně
    if ($form->isValid()) {
        $values = $form->getValues();
	// přihlášení
	$username = $values['name'];
	$password = $values['pass'];
	...
	// nakonec (v případě úspěšného přihlášení) by mělo následovat přesměrování
    }
}

echo $form;
  1. Až se víc seznámíš s formuláři, můžeš použít i validaci (například že vyplnit jméno a heslo je povinné).
daan
Člen | 7
+
0
-
  1. jj, debug mam enabled este na zaciatku indexu, teda o nieco vyssie nez kod, ktory som pastol sem.
  2. Rozumiem. O funkciach isSubmitted a isValid som vedel, myslel som vsak, ze sa daju alternovat klasickou PHP metodou, ktoru pouzivam. (t.j. POST udajov do premennych a nacitanie osobitneho login scriptu v momente, ked prebehne odoslanie formulara)

Prerobil som to teda do nette, tak ako ste mi to opisali, no moj problem pretvava v rovnakej podobe.

index.php vyzera takto

<?php

$form = new Form;
$form ->addText('name','ID: ');
$form ->addPassword('pass','password: ');
$form ->addSubmit('login', 'login');


if ($form->isSubmitted())
  {
    if ($form->isValid())
      {
        $values = $form->getValues();

        $username = $values['name'];
        $password = $values['pass'];

        require 'auth.php';

        $user = Environment::getUser();

        // zaregistrujeme autentizační handler
        $user->setAuthenticationHandler(new MyAuthenticator);

        // nastavíme expiraci
        $user->setExpiration('+ 15 minutes');

        try
          {
             $user->authenticate($username, $password);
             Environment::getHttpResponse()->redirect('admin.php');

          }

        catch (AuthenticationException $e)
          {
            echo 'Chyba: ', $e->getMessage();
          }
            }
    }

echo $form;

?>

a auth.php sa nezmenilo.

Ja si myslim, ze chyba by mohla byt niekde tam (auth.php), resp. celkom dobre nerozumiem tejto casti

<?php

$username = $credentials[self::USERNAME];
$password = sha1($credentials[self::PASSWORD] . $credentials[self::USERNAME]);

?>

Prihlasovacie udaje sme uz pomocou getValues() do tychto premennych nacitali, tak co sa robi tu? Co reprezentuje premenna $credentials?

_Martin_
Generous Backer | 679
+
0
-

Zvláštní, použil jsem přesně ten kód, co jsi teď postnul a vše funguje. Pravda ovšem, že jsem odmazal řádek s použitím dibi, neb jsem nechtěl tvořit databázi. Nicméně, ten dotaz nevypadá, že by oplýval nějakou chybou.

Můžeš mi ještě napsat, jakou verzi Nette (včetně revize v případě verze 0.9) a PHP používáš? Já zkoušel verzi 0.9 revize 332 na PHP 5.2.6.

nAS
Člen | 277
+
0
-

Já být tebou, tak bych se zkusil podívat do examples na příklad CD-collection. Tam je takovýto formulář vyřešen vzorově.

daan
Člen | 7
+
0
-

_Martin_: nette mam vo verzii 0.8 (revision 293) a PHP 5.2.9

Zeby bol problem v MySQL? hm, connect mam v poriadku, tabulka existuje, zlozena je z troch stlpcov (id,login,pass) … Vidite niekde chybu?

nAS: vdaka za radu, pozriem sa aj na to.

_Martin_
Generous Backer | 679
+
0
-

To jsem z toho blázen zkusil jsem revizi 293 a funguje to. Nemůže být chyba v nějakém kódu „okolo“? Zkus udělat jen tyhle dva soubory (přesně zkopíruj, žádné úpravy), jesti ti to bude fungovat:

// index.php
<?php
require 'Nette/loader.php';
Debug::enable();

$form = new Form;
$form ->addText('name','ID: ');
$form ->addPassword('pass','password: ');
$form ->addSubmit('login', 'login');


if ($form->isSubmitted()) {
	if ($form->isValid()) {
		$values = $form->getValues();

		$username = $values['name'];
		$password = $values['pass'];

		require 'auth.php';

		$user = Environment::getUser();

		// zaregistrujeme autentizační handler
		$user->setAuthenticationHandler(new MyAuthenticator);

		// nastavíme expiraci
		$user->setExpiration('+ 15 minutes');

		try {
			 $user->authenticate($username, $password);
			 Environment::getHttpResponse()->redirect('admin.php');

		} catch (AuthenticationException $e) {
			echo 'Chyba: ', $e->getMessage();
		}
	}
}

echo $form;

// auth.php
class MyAuthenticator extends Object implements IAuthenticator
{

	public function authenticate(array $credentials)
	{
		$username = $credentials[self::USERNAME];
		$password = sha1($credentials[self::PASSWORD] . $credentials[self::USERNAME]);

		$row = (object) array(
			'id' => 5,
			'username' => 'pepa',
			'password' => 'd0d1a46636021ba10a2022904f7388f1155e708d', // heslo je abc123
		);

		if (!$row) {
			throw new AuthenticationException("User '$username' not found.", self::IDENTITY_NOT_FOUND);
		}

		if ($row->password !== $password) {
			throw new AuthenticationException("Invalid password.", self::INVALID_CREDENTIAL);
		}

		return new Identity($row->id);
	}

}
daan
Člen | 7
+
0
-

Tak to sem blazen i ja, ponevac som tie kody skusil a po stlaceni tlacidla login dostanem cistu bielu obrazovku pre akykolvek stav. Jedina zmena bola, ze som nahradil

<?php
require 'Nette/loader.php'
?>

s

<?php
require '../framewrks/nette/Nette/loader.php'
?>

co je moja lokacia nette frameworku.

EDIT: Mam nastavene aj zobrazovanie chyb v samotnom PHP.

EDIT 2: Prave sa pozeram na examples priamo v nette adresari a to iste sa deje aj pri odskusani basic-example.php

Miesto zobrazenia „Form was submitted and successfully validated“ dostanem bielu obrazovku.

Editoval daan (10. 6. 2009 18:42)

_Martin_
Generous Backer | 679
+
0
-

Aj PHP 5.2.9 jsem stáhl a vše OK, to už mi hlava nebere, jdeme ořezávat – zkus samotné:

<?php

require '../framewrks/nette/Nette/loader.php';

Debug::enable();

$form = new Form;
$form ->addText('name','ID: ');
$form ->addPassword('pass','password: ');
$form ->addSubmit('login', 'login');

if ($form->isSubmitted()) {
	if ($form->isValid()) {
		$values = $form->getValues();
		echo 'Byl odeslan a je validni.';
		Debug::dump($values);

	} else {
		echo 'Byl odeslan, ale neni validni.';
	}
} else {
	echo 'Nebyl odeslan.';
}

echo $form;

Edit: ještě mě napadá, zkusil jsi Requirements Checker?

Editoval _Martin_ (10. 6. 2009 18:44)

daan
Člen | 7
+
0
-

Solved. :)

V PHP som nemal povoleny ICONV extension. Editol som php.ini, restartol lighttpd a it works.

Dakujem, vazim si Vasu podporu, u nette urcite zostanem. :)

o5
Člen | 416
+
0
-

vsak neboj, od martina ti prijde cislo uctu :-D

daan
Člen | 7
+
0
-

Hmm, ked sa vsak vratim k prikladu s DB selectom, tak mi debugger hlasi.

Class ‚dibi‘ not found

Na riadku s $row = dibi::fetch(‚SELECT id FROM kuserz‘);

Patrik Votoček
Člen | 2221
+
0
-

A máš načtené dibi? nebo máš RobotLoader před tím než voláš dibi::fetch…? Btw pokud používáš RobotLoader tak zkus hodit za inicializaci $loader->rebuild(); jestli laděnka nevyhodí nějákou chybu…

_Martin_
Generous Backer | 679
+
0
-

daan napsal(a):

Class ‚dibi‘ not found

Používáš Nette RobotLoader?

ANO:

  • zkontroluj, zda skenuješ i adresář, ve kterém je dibi umístěné

NE:

  • buď načti soubor s dibi třídou ručně
  • nebo použij RobotLoader:
$loader = new RobotLoader();
$loader->addDirectory('cesta/ke/slozce/s/knihovnami');
$loader->register();

Složka s knihovnami může obsahovat složku Nette s Nette Frameworkem a složku dibi s (jak jinak) dibi, případně jakékoliv další knihovny (třeba nějaké části ze Zend Frameworku, vlastní knihovny, Texy,…).


Předpokládám, že v Nette ještě nevyužíváš funkci pro tvrobu MVC/MVP aplikace, takže ještě RobotLoader neznáš a neznáš ani soubor bootstrap.php – až se s ním seznámíš, zjistíš, že skenované cesty pro RobotLoader se dají nastavit i lehce jinak.

daan
Člen | 7
+
0
-

btw, len tak trosku mimo temu… ako z toho kodu vycucnem len dane databazove ID? ked ho chcem pouzit, ako session pre overovanie na podstrankach? skusam rozne veci s $row->id, ale zatial bez uspechu.