Check_path不在symfony的防火墙后面,如何纠正这个?

时间:2011-10-16 13:42:36

标签: security authentication symfony

我正在尝试对symfony2防火墙进行身份验证,这是我的安全配置

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 )

如何修复或调试此问题,请告知

更新: 对不起,我可能会忘记写道,我已将{_locale}这样的包裹作为前缀 在我的routing.yml

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

3 个答案:

答案 0 :(得分:2)

我认为您必须更改路线模式以包含_locale参数。例如,您应使用pattern: /admin/logincheck

而不是pattern: {_locale}/admin/logincheck

您还可以使用控制台命令app/console router:debug调试路由。

我不是100%确定这可以解决您的问题,但我希望它可以帮助您收集有关您的问题的更多信息。

答案 1 :(得分:0)

为什么不试试

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

答案 2 :(得分:0)

这解决了我的问题,但我的情况很简单,没有{_locale}功能,但也许它会对你有所帮助。

从Symf2书的安全章节:
常见陷阱#3:确保/ login_check位于防火墙后面。

在security.yml文件中,看起来你的check_path路由是/ {_ locale} / admin / logincheck,你的安全路径是^ / {_ locale} / admin /.*后面的任何东西。 所以这似乎很好。
你可能想尝试删除。*(你真的需要吗?)

并进一步向下访问控制部分中的文件,您提供了一个特定的条目,以确保check_path需要身份验证: - {path:^ / ar / admin / logincheck,roles:ROLE_ADMIN}
也许尝试指定这个:
- {path:^ / {_ locale} / admin / logincheck,roles:ROLE_ADMIN}

但实际上,我在想,你甚至可以在security.yml模式值中使用{placeholders}吗?我知道你可以在路由文件中,但我不确定是否安全yml的工作原理是一样的吗?在安全或路由章节的主要symf2书中,我没有看到它被用于任何示例中?