2013-12-09 3 views
0

Сейчас я разрабатываю простой API для сервера непрерывной интеграции с Silex. Теперь api должен быть доступен для всех с секретным ключом, но для зарегистрированных пользователей я хочу, чтобы api был доступен без ключа.Silex SecurityServiceProvider, анонимная настройка не работает

Теперь конфигурация SecurityServiceProvider выглядит следующим образом:

'security.firewalls' => array(

    'login' => array(
     'pattern' => '^/auth/login' 
    ), 
    'secured' => array(
     'pattern' => '^/', 
     'form' => array(
      'login_path' => "/auth/login", 
      'check_path' => "/auth/dologin", 
      'username_parameter' => 'login[username]', 
      'password_parameter' => 'login[password]', 
      "csrf_parameter" => "login[_token]", 
      "failure_path" => "/auth/login", 
     ), 
     'logout' => array(
      'logout_path' => "/auth/logout", 
      "target" => '/', 
      "invalidate_session" => false 
     ), 
     'users' => array(
      // admin:foo 
      'admin' => array('ROLE_ADMIN', '5FZ2Z8QIkA7UTZ4BYkoC+GsReLf569mSKDsfods6LYQ8t+a8EW9oaircfMpmaLbPBh4FOBiiFyLfuZmTSUwzZg==') 
     ) 
    ),'api' => array(
     'pattern' => '^/api', 
     'anonymous' => true 
    ), 
) 

Печально то, что, когда я на/API/страниц он по-прежнему перенаправляет меня на страницу входа в систему, хотя, как вы можете видеть анонимным => правда.

Я могу переместить брандмауэр для/api вверху и удалить анонимную строку, но тогда у меня нет доступа к объекту SecurityContext, чтобы проверить, не аутентифицирован ли пользователь.

ответ

3

Разрешить анонимные пользователи в целом и использовать правила доступа для определения охраняемых районов:

// init the firewall 
$app->register(new Silex\Provider\SecurityServiceProvider(), array(
'security.firewalls' => array(
    'general' => array(
     'pattern' => '^/', 
     'anonymous' => true, 
     'form' => array(
      'login_path' => '/login', 
      'check_path' => '/admin/login_check' 
     ), 
     'users' => $app->share(function () use($app) 
     { 
      return new UserProvider($app); 
     }), 
     'logout' => array(
      'logout_path' => '/admin/logout', 
      'target_url' => '/goodbye' 
     ) 
    ) 
), 
'security.access_rules' => array(
    array('^/admin', 'ROLE_ADMIN') 
), 
'security.role_hierarchy' => array(
    'ROLE_ADMIN' => array('ROLE_USER', 'ROLE_ALLOWED_TO_SWITCH') 
) 

));

Если вы хотите защитить все, кроме/API только определяют два брандмауэров:

// init the firewall 
$app->register(new Silex\Provider\SecurityServiceProvider(), array(
'security.firewalls' => array(
    'anonymous' => array(
     'pattern' => '^/api', 
     'anonymous' => true 
    ), 
    'general' => array(
     'pattern' => '^/', 
     'anonymous' => false, 
     ... 
    ) 
), 
+0

Я хочу защитить все, кроме/API /. – nvartolomei

+0

В этом случае определите два брандмауэра (см. Пример выше). –

+0

Он по-прежнему перенаправляется на страницу входа. Я сказал это в первоначальном вопросе. Я могу получить доступ/api без входа в систему без этой строки «anonymous» => true », но после добавления Silex перенаправляет/login. – nvartolomei

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