2013-05-07 66 views
0

我目前正在用建立一個web應用程序Silex並剛剛開始實施SecurityServiceProvider如何在登錄頁面上提供安全上下文?

添加以下代碼片段到我的引導代碼:

$app->register(new Silex\Provider\SecurityServiceProvider(), array(
    'security.firewalls' => array(
     'login' => array(
      'pattern' => '^/login$', 
      'security' => false, 
     ), 
     'secured' => array(
      'pattern' => '^.*$', 
      'anonymous' => true, 
      'form' => array('login_path' => '/login', 'check_path' => '/login/check'), 
      'logout' => array('logout_path', '/logout'), 
      'users' => $app['custom.user_provider'], 
      'switch_user' => array('parameter' => '_switch_user', 'role' => 'ROLE_IMPERSONATE'), 
     ), 
    ), 
    'security.encoder.digest' => $app->share(function ($app) { 
     return new MySQLPasswordEncoder(false); 
    }), 
)); 
$app['security.role_hierarchy'] = array(
    'ROLE_ADMIN' => array('ROLE_STAFF', 'ROLE_BAN_MGR', 'ROLE_IMPERSONATE'), 
    'ROLE_STAFF' => array('ROLE_USER'), 
); 
$app['security.access_rules'] = array(
    array('^/admin/bans/.*$', 'ROLE_BAN_MGR'), 
    array('^/admin/.*$',  'ROLE_STAFF'), 
    array('^/account/.*$', 'ROLE_USER'), 
    array('^.*$',   ''), 
); 

我希望能夠在任何網頁上使用的安全上下文(即模板is_granted(...)),所以我用'pattern' => '^.*$', 'anonymous' => true
爲了使login_path的要求超出安全區域,我添加了login防火牆。現在

,問題是,安全上下文不可用/login頁面上,因此is_granted(...)拋出一個異常:

AuthenticationCredentialsNotFoundException:安全上下文不包含身份驗證令牌。一個可能的原因可能是沒有爲此URL配置防火牆。

我嘗試添加'security' => true, 'anonymous' => truelogin防火牆,但是這會導致inifinite重定向(因爲/login是一個安全的區域內)。

問題:如何使登錄頁面上的安全上下文可用(根據定義,它可能不安全)?

+0

將anonymous => true添加到登錄路由應該足以滿足您的需求。 – gunnx 2013-05-08 10:22:10

+0

@gunnx我對''security'=> false'和''security'=> true'都試過,但它沒有奏效。 _mpm_的回答很好。 – Lukas 2013-05-08 16:08:50

回答

2

刪除第一個防火牆

'login' => array(
      'pattern' => '^/login$', 
      'security' => false, 
     ), 

,這是不必要的

和改變最後訪問規則,這

array('^/login','IS_AUTHENTICATED_ANONYMOUSLY'), 

更多在這裏的細節,symfony的文檔是你應該花大部分時間,當你有關於silex的問題時:

http://symfony.com/doc/current/book/security.html

+0

作品! Thakns的鏈接 - 在SecurityServiceProvider的Silex文檔中,它只是讀取_Login_path路徑必須始終在安全區域之外定義(或者如果它位於安全區域中,則必須啓用匿名身份驗證機制 - 請參見下文) ; _。 Symfony Books中的解釋要好得多。 – Lukas 2013-05-08 16:07:06

+0

在symx和symfony之間有配置差異,所以要小心,但大部分事情都應該可以開箱即用,玩得開心!你可以在這裏查看一些我的silex腳本:https://github.com/Mparaiso – mpm 2013-05-08 18:38:55

相關問題