2016-03-03 29 views
1

我在symfony 3中遇到了防火牆問題。從3天開始,我一直在爲此付出努力。我已經閱讀過文檔,並根據它做了所有的事情,但是應用程序並沒有像我期望的那樣工作。在一個應用程序中的Symfony 3,2防火牆

目標:所有頁面(登錄頁面除外)都需要登錄用戶。如果用戶沒有登錄,他應該重定向到/登錄頁面。就這樣。

根據這個網頁:

我已創建了登錄操作和表單控制器。 login_path和check_path使用相同的操作(根據文檔)。可能是security.yml中的某些內容是錯誤的,因爲它無法正常工作。我的設置:

security: 
providers: 
    in_memory: 
     memory: 
      users: 
       aaa: 
        password: aaa 
        roles: 'ROLE_ADMIN' 
encoders: 
    Symfony\Component\Security\Core\User\User: plaintext 
firewalls: 
    dev: 
     pattern: ^/(_(profiler|wdt)|css|images|js)/ 
     security: false 
    login_firewall: 
     pattern: ^/login 
     anonymous: ~ 
#  form_login: 
#   login_path: /login 
#   check_path: /login 
    secured_area: 
     pattern: ^/ 
     form_login: 
      login_path: /login 
      check_path: /login 
      default_target_path: homepage 
     logout: 
      path: /logout 
      target: /login 
# access_control: 
#  - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
#  - { path: ^/, roles: IS_AUTHENTICATED_FULLY } 

我的登錄操作:

<?php 
/** 
* @Route("/login", name="login") 
*/ 
public function loginAction(Request $request) 
{ 
    $authenticationUtils = $this->get('security.authentication_utils'); 
    // get the login error if there is one 
    $error = $authenticationUtils->getLastAuthenticationError(); 
    // last username entered by the user 
    $lastUsername = $authenticationUtils->getLastUsername(); 

    return $this->render(
     'security/login.html.twig', 
     array(
      // last username entered by the user 
      'last_username' => $lastUsername, 
      'error'   => $error, 
     ) 
    ); 
} 
?> 

問題:

  1. 有了這個配置我不能登錄請求使用的登錄操作,但系統沒有。想認證我。
  2. 如果我在login_firewall防火牆取消註釋form_login,認證工作正常(我登錄),但我無法訪問網站(系統重定向我到登錄頁面,雖然我已經通過驗證。
  3. 我試着使用ACCESS_CONTROL,但行爲是一樣的2點。

請幫我的人,我敢肯定,這是簡單的東西,但我在Symfony的是新的,我沒有看到它。

UPDATE

感謝Tobias Xy我更正了security.yml。工作版本:

security: 
    providers: 
     in_memory: 
      memory: 
       users: 
        smt: 
         password: smt 
         roles: 'ROLE_ADMIN' 
    encoders: 
     Symfony\Component\Security\Core\User\User: plaintext 
    firewalls: 
     dev: 
      pattern: ^/(_(profiler|wdt)|css|images|js)/ 
      security: false 
     main: 
      anonymous: ~ 
      form_login: 
       login_path: /login 
       check_path: /login 
       default_target_path:/
      logout: 
       path: /logout 
       target: /login 
    access_control: 
     - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/, roles: IS_AUTHENTICATED_FULLY } 

回答

0

修復:

我建議:

  1. 完全取出login_firewall。
  2. 允許匿名用戶在您的secured_area(匿名:〜)
  3. 取消對ACCESS_CONTROL部分(內容看起來很不錯)

讓我知道它的工作。

替代修復:

(這可以工作,但我不是100%肯定這件事)。

  1. 更改您的check_path到別的東西(如/ check_login)
  2. 創建一個空的路線/ check_login(類似於註銷路線,描述如下:Security - Logging out
  3. (確保這條新道路的背後在 「secured_area」 防火牆)

一些解釋

你的問題大概可以本頁解釋:How to Build a Traditional Login Form。它上面寫着:

如果您使用多個防火牆並且針對一個防火牆進行身份驗證,則不會針對任何其他防火牆自動進行身份驗證。不同的防火牆就像不同的安全系統。

這解釋了您的一些問題:如果取消註冊login_firewall中的form_login,則只會向登錄頁面進行身份驗證!一旦你去到另一個頁面,你不再被認證,因爲它是一個不同的安全上下文。

我不是100%確定您的問題1,但可能會發生這種情況,因爲您的「check_path」也位於防火牆login_firewall後面,而不是secured_area。由於login_firewall中沒有form_login,因此提交的登錄表單將無法識別。

+0

感謝您的第一次修復。一切都很完美。你讓我開心 :) – Tomeknr