Symfony安全性重定向到登录页面

Geo*_*iuc 5 php symfony symfony-security

如果我有一个安全的路由,让我们说panel如下,Symfony将只允许登录用户访问.

    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/panel, role: ROLE_USER }
Run Code Online (Sandbox Code Playgroud)

对于未登录的用户,它总是将它们重定向到login_path(我使用的是FOSUserBundle):

security:
    firewalls:   
        main:
            pattern: ^/
            form_login:
                provider: fos_userbundle
                login_path:     fos_user_security_login
Run Code Online (Sandbox Code Playgroud)

我在哪里可以禁用或覆盖此重定向?我想直接显示登录表单,而不重定向用户.

我认为它与此有关AccessDeniedHandlerInterface,但是在security.yml中需要覆盖哪些密钥?默认实现在哪里?

对于我们拥有的其他情况DefaultLogoutSuccessHandler, DefaultAuthenticationFailureHandler, DefaultAuthenticationSuccessHandler,我们可以针对这些情况中的每一种实现服务,这扩展了它们各自的接口并且可以以自定义方式处理该情况.但是,找不到AccessDenied的任何内容.其目录仅包含接口.

cha*_*asr 3

我会手动执行此操作。

让您的路线可以被匿名访问:

- { path: ^/panel, role: [IS_AUTHENTICATED_ANONYMOUSLY, ROLE_USER] }
Run Code Online (Sandbox Code Playgroud)

在您的模板中,检查是否有登录用户:

{% if app.user is null %}
    <!-- Then display your login form -->
{% else %}
    <!-- Display the normal view -->
{% endif %}
Run Code Online (Sandbox Code Playgroud)

或者从控制器执行此操作:

if (!is_object($this->get('security.token_storage')->getToken()->getUser())) {
    // Render the login form
}
Run Code Online (Sandbox Code Playgroud)

像这样,您可以根据用户是否经过身份验证来制定逻辑。