2016-02-23 44 views
5

如果我有一个安全的路线,比如说从下面的panel,Symfony将只允许登录用户访问。Symfony安全重定向到登录页面

- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } 
    - { path: ^/panel, role: ROLE_USER } 

对于未在其登录总会将其重定向到login_path(我使用FOSUserBundle)用户:

security: 
    firewalls: 
     main: 
      pattern: ^/ 
      form_login: 
       provider: fos_userbundle 
       login_path:  fos_user_security_login 

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

我认为它与AccessDeniedHandlerInterface有关,但是什么关键需要在security.yml中覆盖?哪里是默认实现?

对于其他情况,我们有DefaultLogoutSuccessHandler, DefaultAuthenticationFailureHandler, DefaultAuthenticationSuccessHandler,我们可以针对每种情况实施服务,这些服务可以扩展各自的接口并以自定义的方式处理情况。但是,无法找到任何AccessDenied。 Its directory只包含接口。

+2

有什么好处?登录后用户会被重定向回/面板,它不会有什么不同 - 我错过了什么? – ccKep

+0

我想在几条路线上添加一个登录页面。用户想要访问该页面,但他没有登录,所以我向他展示登录表单,并在登录后(使用ajax)将其重定向到面板。 –

+0

要显示登录表单,您应该允许匿名访问。因此,在控制器中检查权限 – Heah

回答

3

我会这样做手动。

要让路由匿名访问:

- { path: ^/panel, role: [IS_AUTHENTICATED_ANONYMOUSLY, ROLE_USER] } 

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

{% if app.user is null %} 
    <!-- Then display your login form --> 
{% else %} 
    <!-- Display the normal view --> 
{% endif %} 

,或者与控制器做到这一点:

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

像这样,您可以根据用户是否通过认证来制定逻辑。

+0

考虑到用户想要访问面板页面,并且他被重定向到显示登录表单(使用ajax进行验证)的页面,我怎么知道登录后在哪个页面重定向用户(在本例中为页面)以及我如何知道用户是否最初想要登录(登录表单是模式并且内容是通过ajax检索的)? –

+0

在你的问题中,你说的是你不想重定向用户,只显示登录表单。要知道用户试图访问哪个页面,可以使用''app.request.headers.get('referer')'从树枝或'$ this-> getRequest() - > headers-> get('referer')'从控制器。然后,如果你想在登录后重定向到引用者,添加一个'_target_path'作为表单字段,用检索到的引用者填充它,并在处理表单的方法中进行重定向(如果你的表单由FOSUser处理,_target_path '会自动使用)。如果您需要示例,我可以进行快速编辑。 – chalasr

+0

好主意,会做。 –