Routing Symfony多址\u拒绝\u url

Routing Symfony多址\u拒绝\u url,routing,symfony,Routing,Symfony,我试图使用Symfony框架限制对某些路由的访问。 目前我的security.yml文件中有以下内容: access_control: - { path: ^/admin, roles: ROLE_ADMIN } - { path: ^/my/account, roles: ROLE_USER } - { path: ^/my, roles: ROLE_ACTIVE } 当用户未登录并尝试访问其中一个帐户页面时,他们将被重定向到登录页面-这是正确的 当用户登录并尝试访问

我试图使用Symfony框架限制对某些路由的访问。 目前我的
security.yml
文件中有以下内容:

access_control:
    - { path: ^/admin, roles: ROLE_ADMIN }
    - { path: ^/my/account, roles: ROLE_USER }
    - { path: ^/my, roles: ROLE_ACTIVE }
当用户未登录并尝试访问其中一个帐户页面时,他们将被重定向到登录页面-这是正确的

当用户登录并尝试访问其中一个帐户页面,但其帐户未激活(即,他们没有激活角色
角色\u
),则会将其重定向到激活页面-这是正确的。 我发现以下几点实现了这一点:

firewalls:
    default:
        ...
        access_denied_url: activate
但是,现在由于
访问被拒绝\u url:activate
当登录用户尝试访问
^/admin
而他们不是管理员(即,他们没有角色
角色\u admin
)时,他们被重定向到
激活
页面。相反,我想将它们重定向到
myu主页
页面。我怎样才能做到这一点

或者,我可以满足于显示未授权页面,但如果我将
@安全(“has_role('role_ADMIN'))
添加到我的管理控制器,并从
访问控制
中删除
{path:^/ADMIN,roles:role_ADMIN}
,它会执行相同的操作,即重定向到激活页面

整个
security.yml
文件供参考:

security:
    encoders:
        AppBundle\Entity\Account:
            algorithm: bcrypt

    providers:
        in_memory:
            memory: ~
        our_db_provider:
            entity:
                class: AppBundle:Account

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

        admin:
            pattern: ^/admin
            access_denied_url: my_homepage
            anonymous: ~
            logout:
                path:   /logout
                target: /            
            provider: our_db_provider

            simple_form:
                authenticator: login_authenticator
                check_path:    login
                login_path:    my_homepage

        default:
            anonymous: ~
            remember_me:
                secret:   '%secret%'
                # Expire in 30 days
                lifetime: 2592000 
                path:     /
            logout:
                path:   /logout
                target: /            
            provider: our_db_provider

            simple_form:
                authenticator: login_authenticator
                check_path:    login
                login_path:    login

            access_denied_url: activate

    access_control:
        - { path: ^/admin, roles: ROLE_ADMIN }
        - { path: ^/my/account, roles: ROLE_USER }
        - { path: ^/my, roles: ROLE_ACTIVE }

为与
^/admin
模式匹配的URL创建特定防火墙:

admin:
    pattern:  ^/admin
    access_denied_url: my_homepage
    # ...
编辑

您需要在两个防火墙之间共享相同的
上下文

admin:
    pattern: ^/admin
    context: default
    access_denied_url: my_homepage
    anonymous: ~
    logout:
        path:   /logout
        target: /            
    provider: our_db_provider

    simple_form:
        authenticator: login_authenticator
        check_path:    login
        login_path:    login
请注意,我将
登录路径
更改为与
默认防火墙相同的路径

并将同一行添加到
默认值中:

default:
    anonymous: ~
    context: default
    remember_me:
        secret:   '%secret%'
        # Expire in 30 days
        lifetime: 2592000 
        path:     /
    logout:
        path:   /logout
        target: /            
    provider: our_db_provider

    simple_form:
        authenticator: login_authenticator
        check_path:    login
        login_path:    login

    access_denied_url: activate
用这些防火墙替换你的防火墙,它应该能正常工作


为与
^/admin
模式匹配的URL创建特定防火墙:

admin:
    pattern:  ^/admin
    access_denied_url: my_homepage
    # ...
编辑

您需要在两个防火墙之间共享相同的
上下文

admin:
    pattern: ^/admin
    context: default
    access_denied_url: my_homepage
    anonymous: ~
    logout:
        path:   /logout
        target: /            
    provider: our_db_provider

    simple_form:
        authenticator: login_authenticator
        check_path:    login
        login_path:    login
请注意,我将
登录路径
更改为与
默认防火墙相同的路径

并将同一行添加到
默认值中:

default:
    anonymous: ~
    context: default
    remember_me:
        secret:   '%secret%'
        # Expire in 30 days
        lifetime: 2592000 
        path:     /
    logout:
        path:   /logout
        target: /            
    provider: our_db_provider

    simple_form:
        authenticator: login_authenticator
        check_path:    login
        login_path:    login

    access_denied_url: activate
用这些防火墙替换你的防火墙,它应该能正常工作


我试过了,但我得到了一个错误:
SecurityExtension.php第435行中的InvalidConfigurationException:没有为防火墙“admin”注册身份验证侦听器。
您需要以与您的
默认值
防火墙相同的方式添加配置(即
登录表单
和其他强制参数)。我没有默认防火墙的配置,也无法为您复制。只需复制第一个并更改
模式
访问被拒绝的url
我认为,因此我添加了与默认完全相同的内容(除了访问被拒绝的url明显不同),而不是重定向到它重定向到登录的激活路由。您使用哪个角色访问该路由?如果他没有被认证,这是预期的行为。否则,将
登录路径
更改为
我的主页
。将
登录路径
更改为
我的主页
会奏效。谢谢我以为我以前试过了,但它出错了。奇怪。我正在测试的用户已登录,但没有
角色\u ADMIN
角色,因为我正在测试以确保非管理员用户无法访问管理员区域并重定向到主用户主页。不确定为什么默认行为是重定向到登录,尽管他们已登录,只是没有使用正确的角色进行授权。我尝试了这样做,但我得到一个错误:
InvalidConfigurationException in SecurityExtension.php第435行:没有为防火墙“admin”注册身份验证侦听器.
您需要以与
默认防火墙相同的方式添加配置(即
登录表单
和其他必需参数)。我没有默认防火墙的配置,也无法为您复制。只需复制第一个并更改
模式
访问被拒绝的url
我认为,因此我添加了与默认完全相同的内容(除了访问被拒绝的url明显不同),而不是重定向到它重定向到登录的激活路由。您使用哪个角色访问该路由?如果他没有被认证,这是预期的行为。否则,将
登录路径
更改为
我的主页
。将
登录路径
更改为
我的主页
会奏效。谢谢我以为我以前试过了,但它出错了。奇怪。我正在测试的用户已登录,但没有
角色\u ADMIN
角色,因为我正在测试以确保非管理员用户无法访问管理员区域并重定向到主用户主页。不确定为什么默认行为是重定向到登录,尽管他们已登录,只是没有获得正确角色的授权。