2013-08-13 4 views
1

Я использую PHP и силикатный, чтобы создать веб-приложение, и я реализовал базовую аутентификацию через SecurityServiceProvider как это: Как вы можете видеть /admin пути обеспеченыПоказать аутентификацию пользователей на небезопасном (анонимном) маршрутах

$app->register(new Silex\Provider\SecurityServiceProvider(), array(
    'security.firewalls' => array(
     'private' => array(
      'remember_me' => array(
       'key' => $config['secret_key'], 
       'lifetime' => $config['remember_me_duration'], 
      ), 
      'pattern' => '^/admin', 
      'form' => array('login_path' => '/login', 'check_path' => '/admin/login_check'), 
      'logout' => array('logout_path' => '/admin/logout'), 
      'users' => $app->share(function() use ($app) { 
       // ... 
      }), 
     ), 
     'public' => array(
      'pattern' => '^/$', 
      'anonymous' => true, 
     ), 
     'login' => array(
      'pattern' => '^/login$', 
      'anonymous' => true, 
     ), 
    ), 
)); 

, там я могу использовать $app['security']->getToken()->getUser();, чтобы получить фактического пользователя, прошедшего проверку подлинности, и отобразить что-то вроде . Записанный как $ username, но если я это сделаю на маршрутах или /, пользователь всегда будет anon., даже если я аутентифицирован.

Как я могу получить аутентификацию пользователя, если есть один, в противном случае anon. строки, на / и /login маршрутов для того, чтобы отобразить сообщение, как: Зашли как $ имени пользователя?

Я также пытался использовать is_granted('IS_AUTHENTICATED_FULLY' функции в шаблонах прута, чтобы проверить, если пользователь прошел проверку подлинности, но на /login и / она возвращает ложь (даже если я проверка подлинности), так как анонимный пользователь имеет приоритет перед проверкой подлинности тех, поэтому никакого успеха здесь нет.

ответ

1

Все должно быть под одним и тем же межсетевым экраном, и вам необходимо использовать управление доступом.

+0

Не могли бы вы привести пример, пожалуйста? Я попытаюсь это сделать, но раньше я использовал access_control без успеха. – Paul

6

Чтобы помочь другим людям, я решил проблему, как описано ниже. Silex не использует access_control, но access_rules (dammit).

Как Пази (+ 1ed) предложил я объединил все под одним брандмауэром и используется access_rules:

$app->register(new Silex\Provider\SecurityServiceProvider(), array(
    'security.firewalls' => array(
     'main' => array(
      'remember_me' => array(
       'key' => $config['secret_key'], 
       'lifetime' => $config['remember_me_duration'], 
      ), 
      'pattern' => '^/', 
      'anonymous' => true, 
      'form' => array(
       'login_path' => '/login', 
       'check_path' => '/admin/login_check', 
      ), 
      'logout' => array('logout_path' => '/admin/logout'), 
      'users' => $app->share(function() use ($app) { 
       // ... 
      }), 
     ), 
    ), 
    'security.access_rules' => array(array('^/admin/files', 'ROLE_ADMIN'), 
    ), 
)); 
+0

Спасибо! Это было именно то, что мне нужно. – Swaraj

0

@Paul Я бы предпочел, чтобы добавить свой комментарий, но я не могу это сделать еще , так как ответ, чем:

похоже вынимая

'pattern' => '^/admin' 

строку из F В шаблоне irewall вы открыли анонимный доступ к/admin/login_check, и это неверно.

Мое предложение принять его обратно и удалить

'anonymous' => 'true' 

линии от брандмауэра. Должна работать одинаково, но будет более обеспечена.

 Смежные вопросы

  • Нет связанных вопросов^_^