invalid data source name při rozdělování aplikace
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- kasparek
- Člen | 43
Ahoj,
rozdělil jsem si aplikaci na FrontModule a na AdminModule ale najednou mi
nefunguje přihlašování a píše mi to chybu
invalid data source name
a to v UserManager.php
a to
na řádku
$row = $this->database->table(self::TABLE_NAME)->where(self::COLUMN_NAME, $username)->fetch();
čtu fóra ale nemůžu nic najít
UserManager.php
<?php
namespace Model;
use Nette,
Nette\Utils\Strings;
/**
* Users management.
*/
class UserManager extends Nette\Object implements Nette\Security\IAuthenticator
{
const
TABLE_NAME = 'users',
COLUMN_ID = 'id',
COLUMN_NAME = 'username',
COLUMN_PASSWORD = 'password',
COLUMN_ROLE = 'role',
PASSWORD_MAX_LENGTH = 4096;
/** @var Nette\Database\Context */
private $database;
public function __construct(Nette\Database\Context $database)
{
$this->database = $database;
}
/**
* Performs an authentication.
* @return Nette\Security\Identity
* @throws Nette\Security\AuthenticationException
*/
public function authenticate(array $credentials)
{
list($username, $password) = $credentials;
$row = $this->database->table(self::TABLE_NAME)->where(self::COLUMN_NAME, $username)->fetch();
if (!$row) {
throw new Nette\Security\AuthenticationException('The username is incorrect.', self::IDENTITY_NOT_FOUND);
} elseif (!self::verifyPassword($password, $row[self::COLUMN_PASSWORD])) {
throw new Nette\Security\AuthenticationException('The password is incorrect.', self::INVALID_CREDENTIAL);
} elseif (PHP_VERSION_ID >= 50307 && substr($row[self::COLUMN_PASSWORD], 0, 3) === '$2a') {
$row->update(array(
self::COLUMN_PASSWORD => self::hashPassword($password),
));
}
$arr = $row->toArray();
unset($arr[self::COLUMN_PASSWORD]);
return new Nette\Security\Identity($row[self::COLUMN_ID], $row[self::COLUMN_ROLE], $arr);
}
/**
* Adds new user.
* @param string
* @param string
* @return void
*/
public function add($username, $password)
{
$this->database->table(self::TABLE_NAME)->insert(array(
self::COLUMN_NAME => $username,
self::COLUMN_PASSWORD => self::hashPassword($password),
));
}
/**
* Computes salted password hash.
* @param string
* @return string
*/
public static function hashPassword($password, $options = NULL)
{
if ($password === Strings::upper($password)) { // perhaps caps lock is on
$password = Strings::lower($password);
}
$password = substr($password, 0, self::PASSWORD_MAX_LENGTH);
$options = $options ?: implode('$', array(
'algo' => PHP_VERSION_ID < 50307 ? '$2a' : '$2y', // blowfish
'cost' => '07',
'salt' => Strings::random(22),
));
return crypt($password, $options);
}
/**
* Verifies that a password matches a hash.
* @return bool
*/
public static function verifyPassword($password, $hash)
{
return self::hashPassword($password, $hash) === $hash
|| (PHP_VERSION_ID >= 50307 && substr($hash, 0, 3) === '$2a' && self::hashPassword($password, $tmp = '$2x' . substr($hash, 3)) === $tmp);
}
}
config.neon
#
# SECURITY WARNING: it is CRITICAL that this file & directory are NOT accessible directly via a web browser!
#
# If you don't protect this directory from direct web access, anybody will be able to see your passwords.
# https://nette.org/en/security-warning
#
parameters:
php:
date.timezone: Europe/Prague
# zlib.output_compression: yes
nette:
application:
errorPresenter: Error
mapping:
*: *Module\*Presenter
session:
expiration: 14 days
database:
dsn: "host=localhost;dbname=test"
user: root
password: root
options:
profiler: true
run: true
lazy: true
services:
- Model\UserManager
- App\RouterFactory
router: @App\RouterFactory::createRouter
Díky za radu ;)
- kasparek
- Člen | 43
Tak nyní jsem přišel na to že mi neproběhne žádný dotaz do db ale
vůbec nechápu proč??
nemohlo by to být tím jak jsem si přepsal
RouterFactory.php
???
<?php
namespace App;
use Nette,
Nette\Application\Routers\RouteList,
Nette\Application\Routers\Route,
Nette\Application\Routers\SimpleRouter;
/**
* Router factory.
*/
class RouterFactory
{
/**
* @return \Nette\Application\IRouter
*/
public function createRouter()
{
$router = new RouteList();
$router[] = new Route('<presenter>/<action>', array(
'module' => 'Front',
'presenter' => 'Homepage',
'action' => 'default',
));
$router[] = new Route('admin/<presenter>/<action>', array(
'module' => 'Admin',
'presenter' => 'Homepage',
'action' => 'default',
));
return $router;
}
}
- kasparek
- Člen | 43
matej21 napsal(a):
Uloz html a nekam to nahraj
http://www.uschovna.cz/…CC2LNCW-7DM/
Editoval kasparek (27. 5. 2014 17:51)
- David Matějka
- Moderator | 6445
uz to vidim. V configu ti v DSN chybi typ databaze (to mysql:
pred host
)
dsn: "mysql:host=localhost;dbname=test"