Přepínání uživatelů pro testovací účely

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

Zdravím,
pro testovací účely potřebuji udělat přepínaní uživatelů, na kterého jsem přihlášen. Představoval bych si to takto:

  1. Kliknu na odkaz přepnout uživatele s parametrem jeho ID
  2. Systém mě přihlásí (hesla nepotřebuji vůbec řešit)
  3. Jsem přihlášen a funguji jako daný uživatel

Něco jsem se pokoušel vymyslet ale nevím jak to uchopit. Neřešil někdo něco podobného?

Díky moc

EDIT:
Upravil jsem si metodu authenticate:

	/**
	 * @param array $credentials
	 * @return Nette\Security\Identity
	 * @throws Nette\Security\AuthenticationException
	 */
	public function authenticate(array $credentials)
	{
		list($id_user) = $credentials;

		$row = $this->database->table(self::TABLE_NAME)->where(self::COLUMN_ID, $id_user)->fetch();

		$arr = $row->toArray();
		return new Nette\Security\Identity($row[self::COLUMN_ID], NULL, $arr);
	}

a následně v akci v presenteru volám:

$this->user->login($id);

ale dostanu následující chybu:

Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace., referer: http://localhost/

Editoval Croc (15. 9. 2016 10:37)

jiri.pudil
Nette Blogger | 1028
+
+2
-

Do Nette\Security\User::login() můžeš místo credentials poslat celou identitu, pak s ní budeš rovnou přihlášený

Jiří Nápravník
Člen | 710
+
0
-

Řešil a byl jsem překvapen, že to není nic složitého. Stačí si vytáhnout z databáze podle id toho člověka a pak v presenteru:

	$this->getUser()->login($user); //v user je identita

A jsi přihlášen na toho nového.

Editoval Jiří Nápravník (15. 9. 2016 10:42)

Croc
Člen | 270
+
0
-

Stále mi to nejde :(

v presenteru kde volám akci na přeputí uživatele mám toto:

	public function actionSwitch($id)
	{
		$identity = $this->userManager->getUserData($id);
		$this->user->login($identity);
	}

//metoda getUserData() vypadá takto:

	public function getUserData($id_user) {
		return $this->database->table(self::TABLE_NAME)
				->where(self::COLUMN_ID, $id_user)->fetch();
	}

//dostávám následující chybu:

Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace., referer: http://localhost/

V DB nemám sloupec pro heslo.

Editoval Croc (15. 9. 2016 10:54)

CZechBoY
Člen | 3608
+
0
-

Ten model ti ale nevrací Identitu uživatele, ale jen nějakej IRow z databáze.
Identitu udělej třeba nějak takhle:

$identity = new Identity($userID, $roles, $additionalData);
Croc
Člen | 270
+
0
-

Blbnu…Nicméně mi to pořád hází stejnou chybu… Mám to teď takhle:

	public function actionSwitch($id)
	{
		$row = $this->userManager->getUserData($id)->fetch();
		$arr = $row->toArray();

		$identity = new Nette\Security\Identity($id, NULL, $arr);

		$this->getUser()->login($identity);
		$this->getPresenter()->redirect("Homepage:default");
	}

Nemůže být problém někde jinde??

Pavel Kravčík
Člen | 1182
+
0
-

Hádám, že chyba bude někde, kde je redirect na stránku s přihlášením, který se zasekne ve smyčce, protože je špatně napsaná. Login vypadá ok.

Croc
Člen | 270
+
0
-

Na té stránce je pouze statické html. Dělá to i když redirect dám pryč, dokonce i když dám celý action pryč.

CZechBoY
Člen | 3608
+
0
-

Statické html v Nette? :-) nějaký BasePresenter si tam nekontroluje něco třeba?

Croc
Člen | 270
+
0
-

Něco zatím zkouším, takže ano, statické HTML.

Jedná se prakticky o čistý sandbox nette 2.3.

Vůbec nefunguje routování, když zadám adresu která ani neexistuje, hodí to stejnou chybu…

Apache/2.4.18 (Ubuntu)
PHP 7.0.10–2+deb.sury.org~xenial+1
Nette 2.3.x (poslední 2.3)

Editoval Croc (15. 9. 2016 12:01)

CZechBoY
Člen | 3608
+
0
-

Co třeba nejdřív zprovoznit nette a potom v tom začít něco psát? :-)
Jakou chybu ti to hlásí? Máš nastavený mod_rewrite a podobný top zádrhely?

Croc
Člen | 270
+
0
-

No úvodní obrazovka sandboxu se mi zobrazila :) tak jsem předpokládal že je to OK :P

Takhle to dopadá když člověk dělá něco jednou za X měsíců… Server je nastavený předpokládám dobře, jedna větší aplikace mi tam běží v poho. Takže to bude něco jen v této.

.htaccess

# Apache configuration file (see httpd.apache.org/docs/current/mod/quickreference.html)

# disable directory listing
<IfModule mod_autoindex.c>
	Options -Indexes
</IfModule>

# enable cool URL
<IfModule mod_rewrite.c>
	RewriteEngine On
	# RewriteBase /

	# prevents files starting with dot to be viewed by browser
	RewriteRule /\.|^\. - [F]

	# front controller
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteCond %{REQUEST_FILENAME} !-d
	RewriteRule !\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz|map)$ index.php [L]
</IfModule>

# enable gzip compression
<IfModule mod_deflate.c>
	<IfModule mod_filter.c>
		AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/x-javascript text/javascript application/javascript application/json
	</IfModule>
</IfModule>
CZechBoY
Člen | 3608
+
0
-

A máš aplikace oddělený po virtual hostech nebo jen adresářema? Máš povolený AllowOverride?

Croc
Člen | 270
+
0
-

Právě to procházím. Nastavení mám takto:

<VirtualHost localhost:80>

	ServerName localhost

	ServerAdmin webmaster@localhost
	DocumentRoot /var/www

	<Directory /var/www>
    	Options Indexes FollowSymLinks Includes ExecCGI
    	AllowOverride All
    	Require all granted
    	Allow from all
	</Directory>

	Alias /project1 "/var/www/project1/www"
	Alias /project2 "/var/www/project2/www/www"
	Alias /project3 "/var/www/project3/www"

	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined

</VirtualHost>
Croc
Člen | 270
+
0
-

Opraveno. Jsem ale blb. Zapomněl jsem v .htaccess doplnit toto:

	# Apache configuration file (see httpd.apache.org/docs/current/mod/quickreference.html)

# disable directory listing
<IfModule mod_autoindex.c>
	Options -Indexes
</IfModule>

# enable cool URL
<IfModule mod_rewrite.c>
	RewriteEngine On
// chybělo:
	RewriteBase /project3/
    RewriteRule ^www/(.*)$ /project3/$1
//-----------
	# prevents files starting with dot to be viewed by browser
	RewriteRule /\.|^\. - [F]

	# front controller
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteCond %{REQUEST_FILENAME} !-d
	RewriteRule !\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz|map)$ index.php [L]

</IfModule>

# enable gzip compression
<IfModule mod_deflate.c>
	<IfModule mod_filter.c>
		AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/x-javascript text/javascript application/javascript application/json
	</IfModule>
</IfModule>
CZechBoY
Člen | 3608
+
0
-

No a neměl bys spíš to www nemít v url? Tzn v tom Aliasu ještě přidat /www na konec?

Alias /project3 "/var/www/project3/www/www"
Croc
Člen | 270
+
0
-

V URL www nemám. Je trochu jiná struktura. Je tam rovnou www a v něm index (ne další www). Už vše šlape jak má. Díky za ty uživatele :)