2016-04-20 3 views
2

Ich suche Hilfe bei der Verwendung des SimpleUser für Silex. Mein composer.json ist am Ende von benötigt verfügbar.Wie macht man einen gerade angemeldeten SimpleUser geschützten Bereich in Silex/Symfony mit?

In SimpleUser können wir auf eine Seite zugreifen, auf der Benutzer sich registrieren können (und möglicherweise ihre E-Mails bestätigen). Wenn die E-Mails nicht bestätigt werden, werden diese Benutzer automatisch nach dem Ausfüllen des Registrierungsformulars angemeldet (über die RegisterAction Zeile 89, die die loginAsUser on line 114 aufrufen).

Ich ging davon aus, dass der Benutzer, nachdem er eingeloggt wurde, Zugriff auf meinen geschützten Bereich hatte, auch wenn er den meisten Seiten/Funktionen noch nicht richtig zugewiesen wurde (was später manuell von einem Administrator erledigt wird).

Was ist eigentlich getan ist, dass nach der Registrierung, wenn ich eine URL aufrufen, habe ich eine 302 redirection an die root/Seite (was von meinen Controllern getan, wenn das Recht auf eine Seite nicht gewährt wird), dann habe ich ein weiterer 302 redirection (das ist "automatisch") zu meiner Login-URL. Ich sehe in den Protokollen, die eine Ausnahme ausgelöst wird.

An AuthenticationException was thrown; redirecting to authentication entry point. {"exception":"[object] (Symfony\\Component\\Security\\Core\\Exception\\AuthenticationCredentialsNotFoundException(code: 0): A Token was not found in the TokenStorage. at C:\\path\\to\\wamp\\www\\Easytrip2\\vendor\\symfony\\security\\Http\\Firewall\\AccessListener.php:53)"} [] 

Der Punkt hier ist, dass die Login-Seite des Benutzer weiß, wie er den Namen anzuzeigen, E-Mail usw., damit der Benutzer auf jeden Fall angemeldet ist

um es zusammenzufassen, mein Problem der vierte Schritt ist:

  1. Zugriff auf eine Seite als anonym,
  2. zur Login-Seite reidrected Erste,
  3. als Benutzer registrieren,
  4. Versuchen Sie, den Zugriff (manuell oder mit einem Link) zu einer beliebigen Seite umleitet zu root (von der erwartet wird) und Wurzel Redirect Form (nicht erwartet) anmelden,
  5. Sehen Sie, dass Sie auf der Login-Seite angemeldet sind.

Mein Denken, nach ein paar Stunden des Bergbaus Code, fand zwei interessante Punkte:

  • Die geworfene Ausnahme ist legitim: es gibt tatsächlich keine token_storage ist. Nach den Konstruktoren habe ich festgestellt, dass es während der Registrierung meines SecurityServiceProvider, Linie 314, ausgefüllt werden soll. Von hier denke ich, dass ich ein falsches Setup in meiner Firewall habe ...
  • Ich habe versucht zu debuggen und zu sehen, was ist in der $app['security.token_storage'], und es ist null, wenn ich Seiten mit einem voll funktionsfähigen und registrierten Benutzer oder mit zugreifen ein neu registrierter Benutzer.
  • Ich schaute auf die loginAsUser Funktion, und ich finde etwas merkwürdig. Das Token wird vom aktuellen Wert in ein neues Token geändert, das zur Authentifizierung des Benutzers verwendet wird. Die Werte authenticated, user und key aus true verändert, "anon." und "public" zu false, Instanz SimpleUser\\User und "public" (die Eigenschaft von key zu providerKey geändert). Könnte es von hier kommen?

EDIT 1: Nach einiger Zeit mit einem Symfony Freund, fand ich, dass, wenn einen neuen Benutzer registrieren (also in der Öffentlichkeit Firewall), die loginAsUser (letzten Aufzählungspunkt in der Liste siehe oben) hat die Token Switch unter Berücksichtigung dieser Firewall. Wenn Sie den Namen der öffentlichen Firewall ändern, werden die Werte $currentToken->key und $token->providerKey geändert. Ich denke, es ist mit einem Missverständnis verknüpft: Wir können uns nicht auf einer Seite einer Firewall einloggen. Ist das richtig ?

Also, haben Sie eine Ahnung, was ich falsch mache?

Hier sind meine Codes:

composer.json:

{ 
    "require": { 
     "silex/silex": "~1.3", 
     "doctrine/dbal": "2.5.*", 
     "symfony/security": "2.7.*", 
     "twig/twig": "1.21.*", 
     "symfony/twig-bridge": "2.7.*", 
     "symfony/form": "2.7.*", 
     "symfony/translation": "2.7.*", 
     "symfony/config": "2.7.*", 
     "jasongrimes/silex-simpleuser": "*", 
     "twig/extensions": "1.3.*", 
     "symfony/validator": "2.*", 
     "phpoffice/phpexcel": "1.*", 
     "symfony/monolog-bridge": "*", 
     "box/spout": "*" 
    }, 
    "require-dev": { 
     "phpunit/phpunit": "*", 
     "symfony/browser-kit": "*", 
     "symfony/css-selector": "*", 
     "silex/web-profiler": "*" 
    }, 
    "autoload":{ 
     "psr-4":{"Easytrip2\\": "src"} 
    }, 
    "autoload-dev":{ 
     "psr-4":{"Easytrip2\\": "tests"} 
    } 
} 

klassischer Controller-Code:

public function fileSearchAction(Request $request, Application $app) { 
    if ($app ['security.authorization_checker']->isGranted ('IS_AUTHENTICATED_FULLY') and $app ['security.authorization_checker']->isGranted ('ROLE_FOLLOWUP')) { 
     //Do something and return 
    } else { 
     $app ['session']->getFlashBag()->add ('error', 'Don\'t have the rights...'); 
     return $app->redirect ($app ['url_generator']->generate ('home')); 
    } 
} 

Meine Firewall:

$app->register (new Silex\Provider\SecurityServiceProvider(), array (
     'security.firewalls' => array (
       'public' => array (
         'pattern' => '^/user/(login|logout|register)$', 
         'form' => array (
           'login_path' => '/user/login', 
           'check_path' => '/user/login_check' 
         ), 
         'logout' => array (
           'logout_path' => '/user/logout', 
           'invalidate_session' => true 
         ), 
         'anonymous' => true, 
         'users' => $app->share (function() use ($app) { 
          return $app ['user.manager']; 
         }) 
       ), 
       'secured' => array (
         'pattern' => '^(/|(/user/.*)|(/view/.*)|(/search/.*)|(/admin/.*))$', 
         'form' => array (
           'login_path' => '/user/login', 
           'check_path' => '/user/login_check' 
         ), 
         'logout' => array (
           'logout_path' => '/user/logout', 
           'invalidate_session' => true 
         ), 
         'anonymous' => false, 
         'users' => $app->share (function() use ($app) { 
          return $app ['user.manager']; 
         }) 
       ) 
     ) 
)); 

Und mein h Ome Route:

$app->get ('/', "Easytrip2\Controller\HomeController::indexAction")->bind ('home'); 

Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen.

Ich weiß, ich sollte das Recht in eine $app['security.access_rules'] verwalten, und es ist eine der nächsten Verbesserungen. Es sollte dieses Problem jedoch nicht verursachen.

Danke für Ihre Hilfe!

+0

Ihre Benutzer werden nie in einer "gesicherten" Firewall authentifiziert (die Authentifizierung findet in der öffentlichen Firewall statt und das Token wird nicht freigegeben). Warum verwenden Sie überhaupt unterschiedliche Firewalls? – xabbuh

+0

Ich dachte, dass ich mindestens einen öffentlichen Teil brauchte, um Benutzern zu erlauben sich anzumelden (die Öffentlichkeit hat 'anonymous = true'). Ist das falsch ? Wie kann der Benutzer auf die Anmeldeseite zugreifen, wenn er sich hinter einer Firewall befindet? –

+0

Sie hatten Recht, denke ich. Da der 'loginAsUser'-Aufruf in der öffentlichen Firewall erfolgt, habe ich mich nie am gesicherten angemeldet und werde daher für evey-geschützte URL umgeleitet. –

Antwort

1

Ich habe die line 114 von UserController.php von SimpleUser kommentiert. IMO, sollten wir nicht versuchen, den Benutzer auf einer öffentlichen Seite zu protokollieren: Symfony/Silex Attribut ein Token mit der öffentlichen Firewall verbunden, so verweigern Sie jeden Zugriff auf gesicherte Seiten.

Alles funktioniert jetzt gut, vielen Dank für Ihre Hilfe!