2016-04-14 14 views
0

私はSilexのWebサイトに安全な領域を設定しました。ユーザーが接続されているときはヘッダーにユーザー名を表示し、ユーザーが接続されていない場合はログインフォームへのリンクを表示する必要があります。 しかし、ユーザーが(ファイアウォールの外側に)保護されていないページにいる場合、app.userは定義されていません。Silex - 保護された領域外のユーザへのアクセス

私はthisソリューションを試しましたが、動作しません。

ここに私のセキュリティ設定:

$app->register(new Silex\Provider\SecurityServiceProvider(), array(
    'security.firewalls' => array(
     'account' => array(
      'pattern' => '^/account', 
      'form' => array('login_path' => '/login', 'check_path' => '/account/login_check'), 
      'users' => $app->share(function() use ($app) { 
       return new UserProvider($app['db']); 
      }), 
     ), 
     'unsecured' => array(
      'anonymous' => true, 
     ), 
    ) 
)); 

そして、ここで私は、ユーザー名を表示しています私のヘッダー:

{% if app.user %} 
    {{ app.user.username }}<br /> 
     <a href="{{ path('account') }}">Mon compte</a> 
    {% else %} 
     <a href="{{ path('login') }}">se connecter</a><br /> 
     <a href="{{ path('signup') }}">créer un compte</a> 
{% endif %} 

答えて

1

あなたは^/patternを変更することで、すべてのアプリケーションにファイアウォールを拡張し、匿名を許可することができますアクセス'anonymous' => true。セキュリティで保護する必要がありますパスは、ユーザーが役割ROLE_USERsecurity.access_rulesからすべてのパスへのアクセスを有することを意味する役割ROLE_USERを返す必要がありますgetRoles()security.access_rules

$app->register(new Silex\Provider\SecurityServiceProvider(), array(
    'security.firewalls' => array(
     'account' => array(
      'pattern' => '^/', 
      'form' => array('login_path' => '/login', 'check_path' => '/login_check'), 
      'users' => $app->share(function() use ($app) { 
       return new UserProvider($app['db']); 
      }), 
      'anonymous' => true, 
     ) 
    ) 
)); 

$app['security.access_rules'] = array(
    array('^/account', 'ROLE_USER', null) 
); 

ユーザーメソッドで指定します。

class User implements \Symfony\Component\Security\Core\User\AdvancedUserInterface 
{ 
... 
    public function getRoles() 
    { 
     return array(new \Symfony\Component\Security\Core\Role\Role('ROLE_USER')); 
    } 
... 
} 
+0

ブーム、働いています、ありがとう! –

関連する問題