Код для Silex check_path для проверки логина пользователя

В настоящее время я следую учебному пособию Silex по поставщику услуг безопасности.

У меня есть форма входа в систему, с моим check_path, установленным в / login_check, используя этот код:

$app->register(new Silex\Provider\SecurityServiceProvider(), array(
    'security.firewalls' => array(
        'admin' => array(
            'pattern' => '^/contacts/add',
            'form' => array('login_path' => '/login', 'check_path' => '/login_check'),
            'users' => array(
                'admin' => array('ROLE_ADMIN', '5FZ2Z8QIkA7UTZ4BYkoC+GsReLf569mSKDsfods6LYQ8t+a8EW9oaircfMpmaLbPBh4FOBiiFyLfuZmTSUwzZg=='),
            ),
        )
    )
));

Тем не менее, я не знаю, как проверить логин пользователя в Silex, поскольку нет примера кода для login_check:

$app->post('/login_check', function(Request $request) use ($app) {
    // What now??
});

1 ответ

Silex/Symfony обработает для вас проверку подлинности, так что вы не будете ловить маршрут /login_check, но вы можете добавить обработчик, который будет вызываться Silex после успешного входа в систему:

$app['security.authentication.success_handler.admin'] = 
  $app->share(function() use ($app) {
    return new CustomAuthenticationSuccessHandler($app['security.http_utils'], 
    array(), $app);
  });

CustomAuthenticationSuccessHandler расширяет DefaultAuthenticationSuccessHandler (пример):

use Symfony\Component\Security\Http\Authentication\DefaultAuthenticationSuccessHandler;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Http\HttpUtils;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Silex\Application;

class CustomAuthenticationSuccessHandler extends DefaultAuthenticationSuccessHandler
{
  protected $app = null;

  public function __construct(HttpUtils $httpUtils, array $options, Application $app)
  {
    parent::__construct($httpUtils, $options);
    $this->app = $app;
  }

  public function onAuthenticationSuccess(Request $request, TokenInterface $token)
  {
    $user = $token->getUser();
    $data = array(
        'last_login' => date('Y-m-d H:i:s')
    );
    // save the last login of the user
    $this->app['account']->updateUserData($user->getUsername(), $data);

    return $this->httpUtils->createRedirectResponse($request, $this->determineTargetUrl($request));
  }
}

в этом примере onAuthenticationSuccess() обновите данные пользователя и зарегистрируйте дату и время последнего входа в систему - вы можете выполнить любое другое действие там.

Существует также обработчик для сбоя аутентификации и выхода из системы.

Другие вопросы по тегам