2013-12-09 47 views
0

現在我正在爲使用Silex的持續集成服務器開發一個簡單的API。 現在,每個人都可以通過密鑰訪問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