Symfony 使用访问控制返回被拒绝的访问

Symfony 使用访问控制返回被拒绝的访问,symfony,security,symfony4,access-control,Symfony,Security,Symfony4,Access Control,我在我的安全性中使用Symfony 4.1.7。yaml具有以下访问控制: access_control: # master: - { path: ^/master, roles: ROLE_MASTER } # manager: - { path: ^/.*/manager, roles: ROLE_MANAGER } # main: - { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY } 当我打

我在我的
安全性中使用Symfony 4.1.7。yaml
具有以下访问控制:

access_control:
    # master:
    - { path: ^/master, roles: ROLE_MASTER }
    # manager:
    - { path: ^/.*/manager, roles: ROLE_MANAGER }
    # main:
    - { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY }
当我打开第二个url
(/foo/manager)
且未经授权时,我将重定向到登录路径,我需要返回访问权限denaid not redirect to login。 我的最后一个目标是为append角色调用事件监听器,以便从事件监听器授权用户

更新: 这是我的安全防火墙部分:

 main:
        pattern: ^/
        user_checker: App\Security\Checker\UserChecker
        anonymous: ~
        provider: default
        context: primary
        simple_form:
            authenticator: App\Security\Authenticator\UserAuthenticator
            check_path: login
            login_path: login
            username_parameter: phone
            password_parameter: password
            use_referer: true
        logout:
            path: logout
        remember_me:
            secret: '%kernel.secret%'
            lifetime: 604800
            path: /
            remember_me_parameter: remember_me

您必须允许用户访问此路径,并使用控制器检查用户角色

$this->denyAccessUnlessGranted('ROLE_MANAGER ', null, 'Unable to access this page!');


取决于您要执行的操作。

您需要在security.yml中配置登录路径

例如:

providers:
    fos_userbundle:
        id: fos_user.user_provider.username_email
    in_memory: { memory: ~ }
encoders:
    FOS\UserBundle\Model\UserInterface: sha512
firewalls:
    dev:
        pattern: ^/(_(profiler|wdt)|css|images|js)/
        security: false
    main:
        pattern:             .*
        context:            user
        form_login:
            provider:       fos_userbundle
            login_path:     /login
            use_forward:    false
            check_path:     /login_check
            failure_path:   null

抱歉@A.Seddighi误解了您的问题,已编辑。如果我这样做,我需要将其写入所有控制器,我认为这不是一个好方法,这是正确的方法@A.Seddighi<
security.yml
中的code>access\u control可帮助您设置全局规则,并根据角色阻止对某些路径的访问。如果你真的想要你需要的,你需要自己去做。Symfony很方便,但它不是魔法……;)我有登录路径。我正在更新并添加防火墙代码我需要拒绝访问而不是重定向到loginTry添加
use\u forward
参数,就像我的示例一样。它解决了我的问题。真的改变了我的生活。谢谢你,Eze。@EZEQUEELESNAOLA不工作我添加了
在用户更改时注销
并实现了
EquatableInterface
,但是
在用户更改时注销
防火墙选项不受欢迎,将在5.0中删除。@EZEQUEELESNAOLA问题解决了我被删除了
在用户更改时注销
,它只起作用使用
equalTableInterface
,tnx提供帮助。
providers:
    fos_userbundle:
        id: fos_user.user_provider.username_email
    in_memory: { memory: ~ }
encoders:
    FOS\UserBundle\Model\UserInterface: sha512
firewalls:
    dev:
        pattern: ^/(_(profiler|wdt)|css|images|js)/
        security: false
    main:
        pattern:             .*
        context:            user
        form_login:
            provider:       fos_userbundle
            login_path:     /login
            use_forward:    false
            check_path:     /login_check
            failure_path:   null