2017-09-04 10 views
0

J'essaie de configurer le système d'authentification dans Silex. Cependant, l'erreur suivante apparaît: ErrorSilex: Le système d'authentification de sécurité tente d'exécuter la commande 'login_check'

Bien sûr, j'ai cherché une solution sur Internet. Mais chaque sujet dit que 'login_check' devrait être derrière le pare-feu. Par conséquent, il est placé dans la zone/Users /.

J'ai essayé d'entrer dans la zone protégée. Cependant, le pare-feu fonctionne, car je suis redirigé vers la page de connexion. J'utilise les lignes de code suivantes pour obtenir ce que je veux.

La partie enregistrement:

$app->register(new Silex\Provider\SecurityServiceProvider(), array(
    'security.firewalls' => array(
     'login_path' => array(
      'pattern' => '^/Security/login$', 
      'anonymous' => true 
     ), 
     'default' => array(
      'pattern' => '^/Security/User/.*$', 
      'anonymous' => true, 
      'form' => array(
       'login_path' => '/Security/login', 
       'check_path' => '/Security/User/login_check', 
      ), 
      'logout' => array(
       'logout_path' => '/Security/User/logout', 
       'invalidate_session' => false 
      ), 
      'users' => function($app) { 
       return new User\UserProvider($app['db']); 
      }, 
     ) 
    ), 
    'security.access_rules' => array(
     array('^/Security/login$', 'IS_AUTHENTICATED_ANONYMOUSLY'), 
     array('^/Security/User/.+$', 'ROLE_USER') 
    ) 
)); 

L'itinéraire de connexion:

$routes->match('/login', function(Request $request) use ($app) { 
    return $app['twig']->render('form.html.twig', array(
     'error' => $app['security.last_error']($request), 
     'last_username' => $app['session']->get('_security.last_username'), 
    )); 
})->bind('login'); 

$routes->match('/User/page', function() use ($app) { 
    return $app['twig']->render('index.html.twig', array()); 
})->bind('user.page'); 

Form.html.twig:

{% extends "layout.html.twig" %} 

{% block content %} 
    {% if is_granted('ROLE_USER') %} 
     <p>Welcome {{ app.security.token.user.username }}!</p> 
     <p><a href="{{ path('/User/logout') }}">Log out</a></p> 
    {% else %} 
     <form action="{{ path('/User/login_check') }}" method="post"> 
      <p><label for="username">Username: </label><input id="username" type="text" name="_username" value="{{ last_username }}"></p> 
      <p><label for="password">Password: </label><input id="password" type="password" name="_password"></p> 
      <p><input type="submit" value="Log in"></p> 
      {% if error %} 
       <div class="error">{{ error }}</div> 
      {% endif %} 
     </form> 
    {% endif %} 
{% endblock %} 

Qui peut me dire pourquoi le système essaie toujours d'exécuter la route login_check? Cela devrait être géré par Silex. Et il est situé dans la zone protégée.

Répondre

1

La fonction path accepte le nom de l'itinéraire en tant que paramètre, pas l'adresse URL. Fournisseur de sécurité fait de fausses routes pour les chemins check_path et logout_path. Leurs noms dépendent des chemins, le nom de la route est le chemin où toutes les occurrences de / sont remplacées par _.

Donc, pour vous cas check_path nom de l'itinéraire est Security_User_login_check et logout_path nom de l'itinéraire est Security_User_logout.

Fix path appels à {{ path('Security_User_login_check') }} et {{ path('Security_User_logout') }}

+0

qui a fait le travail! –