Symfony Security:即使用户没有匹配角色,也不需要Auth

时间:2016-01-18 15:44:25

标签: symfony security symfony-2.3

我遇到了一个奇怪的问题。我有以下security.yml:

security:
    encoders:
        Symfony\Component\Security\Core\User\User: plaintext

    role_hierarchy:
        ROLE_USER:
        ROLE_EDITOR:      [ROLE_USER]
        ROLE_ADMIN:       [ROLE_USER, ROLE_EDITOR]

    providers:
        in_memory:
            memory:
                users:
                    admin: { password: 123456, roles: [ 'ROLE_ADMIN' ] }
                    editor: { password: 123456, roles: [ 'ROLE_EDITOR' ] }

    firewalls:
        dev:
            pattern:  ^/(_(profiler|wdt)|css|images|js)/
            security: false

        backend:
            pattern: ^/backend
            anonymous: ~
            provider: in_memory
            form_login:
                login_path: backend_login
                check_path: backend_login_check

    access_control:
        - { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY, host: example\.com$ }
        - { path: ^/backend_login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/backend, roles: ROLE_ADMIN }
        - { path: ^/user/fetch, roles: ROLE_USER }
        - { path: ^/level, roles: ROLE_USER }
        - { path: ^/gallery, roles: ROLE_USER }

我有一台运行XAMPP的窗口开发机器,一切正常。我可以登录到后端,如果我没有登录并尝试打开后端路由,我会被重定向到登录页面。

这是我的路由部分:

backend_login:
    pattern:    /backend_login
    defaults:   { _controller: FooBackendBundle:Security:login }

backend_login_check:
    pattern:   /backend/login_check

但是当我将它上传到我的集成linux服务器时,我可以打开后端而无需登录。看起来Symfony并不关心当前用户的角色。

代码和symfony版本完全相同(Symfony 2.3)。

如果我从后端防火墙中删除anonymous: ~部分,它将重定向到登录页面,但也会创建一个inifite重定向循环。

有人知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

来自Symfony documentation

  

对于每个传入请求,Symfony会检查每个access_control条目以查找与当前请求匹配的条目。一旦找到匹配的access_control条目,它就会停止 - 只有第一个匹配的access_control用于强制访问。

在安全配置中设置<span class="input-label-caption" *ngIf="!inputControl.validators.required" > (optional) </span> 时,您希望将限制最少的匹配放在最后。在您的情况下,您将始终匹配第一个模式,因为所有路由在access_control上匹配,因此不需要任何身份验证。将您的^/更改为此:

access_control

我删除了access_control: - { path: ^/backend_login, roles: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/backend, roles: ROLE_ADMIN } - { path: ^/user/fetch, roles: ROLE_USER } - { path: ^/level, roles: ROLE_USER } - { path: ^/gallery, roles: ROLE_USER } - { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY } 参数,因为它看起来并不相关。