2011-10-16 37 views
4

我想對Symfony2的防火牆認證,這是我的安全配置Check_path不在symfony的防火牆後面,如何解決這個問題?

security: 
    encoders: 
     Symfony\Component\Security\Core\User\User: plaintext 
    role_hierarchy: 
     ROLE_ADMIN:  ROLE_USER 
     ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] 
    providers: 
     in_memory: 
      users: 
       user: { password: user, roles: [ 'ROLE_USER' ] } 
       admin: { password: admin, roles: [ 'ROLE_ADMIN' ]} 
     #main: 
      #entity: { class: Surgeworks\CoreBundle\Entity\User, property: username} 
    firewalls: 
     public: 
      pattern: .* 
      security: false 
      anonymous: true 
      form_login: 
       check_path: /{_locale}/admin/logincheck 
     login: 
      pattern: ^/{_locale}/admin/login$ 
      security: false 
      anonymous: ~ 
     dev: 
      pattern: ^/(_(profiler|wdt)|css|images|js)/ 
      security: false 
      anonymous: ~ 
     secured_area : 
      provider: in_memory 
      pattern: ^/{_locale}/admin/.* 
      form_login: 
       check_path: /{_locale}/admin/logincheck 
       login_path: /{_locale}/admin/login 
      logout: 
       path : /{_locale}/admin/logout 
       target : /{_locale}/admin/ 
      remember_me: 
       key:  aSecretKey 
       lifetime: 3600 
       path:  /admin/ 
       domain: ~ # Defaults to the current domain from $_SERVER 
    access_control: 
     - { path: ^/{_locale}/admin/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/{_locale}/, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/ar/admin/logincheck, roles: ROLE_ADMIN } 
     - { path: ^/(ar|en|fr)/admin/, roles: ROLE_ADMIN } 

,這裏是我的DaghoSiteBundle/Resources/config/routing.yml路由:

_admin: 
    pattern: /admin/ 
    defaults: { _controller: DaghoSiteBundle:Login:login , _locale : ar } 
    requirements: 
    _locale: (ar|en|fr) 
login: 
    pattern: /admin/login 
    defaults : { _controller: DaghoSiteBundle:Login:login , _locale : ar } 
    requirements: 
     _locale: (ar|en|fr) 
logincheck: 
    pattern: /admin/logincheck 
    #defaults: { _controller: DaghoSiteBundle:Login:logincheck , _locale: ar } 
    #requirements: 
     #_locale: (ar|en|fr) 
logout: 
    pattern: /admin/logout 

我無法通過這些設置登錄, 它總是拋出異常

無法找到路徑「/ ar/admin/logincheck」的控制器。也許 你忘了加上匹配的路由在你的路由配置

即使有安裝路徑check_path頁>>我將能夠查看check_path而不被重定向到登錄頁面..

/en/admin >> login page 
/en/logincheck >> display the logincheck template (i.e /en/logincheck isn't behind firewall) 

如何修復,或調試這個問題,請大家指教

UPDATE: 對不起,我可能忘了寫,我已經前綴我的包與{_locale}這樣 在我的routing.yml

DaghoSiteBundle: 
    resource: "@DaghoSiteBundle/Resources/config/routing.yml" 
    prefix: /{_locale} 
    requirements: 
     _locale: ar|en|fr 
    defaults: { _locale: ar } 
+0

作爲'pattern'接受雷克斯,你不能在裏面使用{佔位符} –

回答

2

,我認爲你必須改變你的路由模式,包括您的_locale參數。而不是,例如,pattern: /admin/logincheck您應該使用pattern: {_locale}/admin/logincheck

您還可以使用控制檯命令app/console router:debug來調試您的路由。

我不是100%確定這會解決您的問題,但我希望它能幫助您收集有關您問題的更多信息。

+0

我已經更新了我的問題 – tawfekov

0

你爲什麼不嘗試

logincheck: 
    pattern: /admin/login_check 
    #defaults: { _controller: DaghoSiteBundle:Login:logincheck , _locale: ar } 
    #requirements: 
     #_locale: (ar|en|fr) 
0

這解決了我的問題,但我的情況很簡單,不具備{} _locale功能,但也許它會幫助你的好意。

來自Symf2書籍的安全性章節:
常見陷阱#3:請確保/ login_check位於防火牆之後。

在你security.yml文件時,它看起來像你的check_path路線/ {_區域} /管理/ logincheck,和您的安全路徑是什麼,背後^/{_區域} /管理員/.* ,這樣似乎好。
你可能想嘗試刪除。*(你真的需要它嗎?)

,並進一步向下您提供了具體的條目,使訪問控制部分的文件確認check_path要求身份驗證: - {路徑:^/AR /管理/ logincheck,角色:ROLE_ADMIN}
也許請嘗試指定這個代替:
- {路徑:^/{_區域} /管理/ logincheck,角色:ROLE_ADMIN}

但實際上,我想知道,可你甚至可以使用{佔位符}中的安全性。 yml模式值?我知道你可以在路由文件中,但我不確定安全yml是否以相同的方式工作?我沒有看到它在安全或路由章節的主symf2書中的任何示例中都被使用過?