2016-05-04 10 views
3

私は意図的にカスタムエラーページにしようとすると、未定義のルートにアクセスしようとすると、サーバーは500エラーで応答します。ログは言う:Symfony 2.8 - どのURLにファイアウォールを設定するのですか?

request.CRITICAL:(symfonyの\コンポーネント\セキュリティ\コア\例外の\ AuthenticationCredentialsNotFoundException例外を処理するときにスローされる例外:。トークンストレージが全く認証トークンが含まれていない一つの可能​​な理由はありませんがあることかもしれこのURLのために設定されたファイアウォール。

この例外は500エラーが故に、NotFoundException後にスローされます。 はこのように、私は、任意のURLのためにファイアウォールを設定する方法を見つけ出すことを試み、より具体的には、これらのすべてについて誰が既にファイアウォールで処理されているのかを確認することができます。発見される。私はまで来たこのUserBundle /リソース/設定/ security.ymlファイル

security: 
encoders: 
    FOS\UserBundle\Model\UserInterface: sha512 

providers: 
    fos_userbundle: 
     id: fos_user.user_provider.username 

firewalls: 
    dev: 
     pattern: ^/(_(profiler|wdt))/ 
     security: false 
    public: 
     pattern:     ^/(contact/faq)$ 
     anonymous:     true 
    secure: 
     pattern:     ^/ 
     form_login: 
      provider:    fos_userbundle 
      csrf_token_generator: security.csrf.token_manager 
      login_path:    fos_user_security_login 
      check_path:    fos_user_security_check 
      use_forward:   false 
      failure_path:   null 
      default_target_path: /
      remember_me:   true 
     logout: 
      path:     fos_user_security_logout 
      target:    /
     anonymous:     true 
     remember_me: 
      secret:     %secret% 
      name:     whatev 
      lifetime:    31536000 
      path:     /
      remember_me_parameter: _remember_me 
      secure:     true 
      always_remember_me:  true 
    default: 
     anonymous: true 

すべてのから構成され、私のメインのセキュリティファイルにインポート:

imports: 
- { resource: "@UserBundle/Resources/config/security.yml" } 

security: 
    role_hierarchy: 
     ROLE_ADMIN:  ROLE_USER 
     ROLE_SUPER_ADMIN: ROLE_ADMIN 

access_control: 
    - { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY } # my try to match all routes... 
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/administration/, role: ROLE_ADMIN } 
    - { path: ^/user$, role: IS_AUTHENTICATED_FULLY } 

はここに私のerror.htmlです。アプリ/リソース/ TwigBundle /ビュー/例外下小枝:

<!DOCTYPE html> 
<html> 
    <head> 
     <meta charset="{{ _charset }}" /> 
     <title>An Error Occurred: {{ status_text }}</title> 
    </head> 
    <body> 
     <h1>Oops! An Error Occurred</h1> 
     <h2>The server returned a "{{ status_code }} {{ status_text }}".</h2> 

     <div> 
      Something is broken. Please let us know what you were doing when this error occurred. 
      We will fix it as soon as possible. Sorry for any inconvenience caused. 
     </div> 
    </body> 
</html> 

続行する方法上の任意の手掛かりを?

ありがとうございます。

+0

あなたは私達にあなたの 'error.twig'(またはものは何でもあなたは404エラーのために使用)テンプレートを表示することができますか? – Federkun

+0

ビューでis_granted()を使用するときに問題が発生する可能性がありますが、私はそうではありません。私はとにかく私の意見を表示するように編集しました。 – Matt

+0

'AuthorizationChecker :: isGranted'を使用し、ファイアウォールのイベントが登録される(優先度<= 8)前に送出されるイベントリスナーを作成しましたか? – Federkun

答えて

1

としてフェデリコによって指摘、問題が実行しようとしていたイベントリスナーから来ている:それについて二度考えると当然のことながら

public function add(Request $request) 
{ 
    if($this->securityContext->isGranted('IS_AUTHENTICATED_FULLY')) { 
     /* do stuff considering the user is logged in. 
     ** This is wrong ; we can end up here while having a logged out user. 
     */ 

、それがダムようです。セキュリティコンテキストで実際にisGranted()を呼び出すことができることを保証するだけで、問題全体を解決するだけです。これを確認するには、次のことを確認する必要があります。

  1. セキュリティコンテキストのトークンがNULLではありません。
  2. このトークンのユーザーは、ユーザーエンティティのインスタンスです(ユーザーは実際にログインしています)。

これはに上記の方法を変更します。

public function add(Request $request) 
{ 
    if($this->securityContext->getToken() === null) 
     return false; 

    if(!$this->securityContext->getToken()->getUser() instanceof User) 
     return false; 

    if($this->securityContext->isGranted('IS_AUTHENTICATED_FULLY')) { 
     // do stuff considering the user is logged in. 
関連する問題