2016-05-04 8 views
3

Immer wenn ich absichtlich versuche, benutzerdefinierte Fehlerseiten zu versuchen, auf eine undefinierte Route zuzugreifen, antwortet der Server mit einem Fehler von 500. Logs sagen:Symfony 2.8 - Wie konfiguriere ich eine Firewall für eine beliebige URL?

request.CRITICAL: Exception ausgelöst, wenn eine Ausnahme (Symfony \ Component \ Security \ Core \ Exception \ AuthenticationCredentialsNotFoundException Handhabung: Das Token-Speicherung enthält keine Token-Authentifizierung Ein möglicher Grund sein kann, dass es keine. konfigurierte Firewall für diese URL.

Diese Ausnahme nach dem NotFoundException geworfen wird, damit die 500-Fehler. So habe ich versucht, herauszufinden, wie eine Firewall für jede URL konfigurieren und insbesondere für all jene, Wer bereits von einer Firewall behandelt wird, kann damit die Anmeldeinformationen tatsächlich bearbeiten ly gefunden werden. Ich kam auf diese UserBundle/Ressourcen/config/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 

des Alles in meinem Haupt-Sicherheitsdatei importiert, die besteht aus:

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 } 

Hier ist meine error.html. Zweig unter app/Resources/TwigBundle/views/Ausnahme:

<!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> 

Jeder Hinweis, wie Sie vorgehen?

Vielen Dank.

+0

können Sie uns zeigen Sie Ihre 'error.twig' (oder was auch immer verwenden Sie für 404-Fehler) Vorlage? – Federkun

+0

Ich weiß, dass es Probleme bei der Verwendung von is_granted() in Ansichten geben kann, aber ich bin nicht. Ich habe sie bearbeitet, um dir meine Ansicht zu zeigen. – Matt

+0

haben Sie einen Ereignis-Listener erstellt, der 'AuthorizationChecker :: isGranted' verwendet und ausgelöst wird, bevor das Ereignis der Firewall registriert wird (Priorität <= 8)? – Federkun

Antwort

1

Wie von Federico wies darauf hin, kommt das Problem von einem Ereignis-Listener, die auszuführen versuchen:

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. 
     */ 

Natürlich, wenn zweimal darüber nachzudenken, es dumm scheint. Korrigieren Sie einfach das ganze Problem, indem Sie sicherstellen, dass Sie isGranted() im Sicherheitskontext aufrufen können. Um dies zu überprüfen, müssen Sie Folgendes überprüfen:

  1. Das Token des Sicherheitskontexts ist nicht null;
  2. Der Benutzer dieses Tokens ist eine Instanz Ihrer Benutzereinheit (der Benutzer ist tatsächlich angemeldet).

Dadurch ändert sich die obige Methode:

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. 
Verwandte Themen