【问题标题】:Symfony2 lock full site with firewallSymfony2 使用防火墙锁定完整站点
【发布时间】:2013-07-27 21:01:05
【问题描述】:

我想关闭我的整个网站,只允许经过身份验证的用户访问,但我想保留一些公开的路线。公共路线是:

/

/新闻

/注册

所有其他人都被锁定。 我做了一个看起来像这样的防火墙:

firewalls:
    user_login:
        pattern: ^/
        anonymous: ~

    user_area:
        pattern: ^/
        form_login:
            login_path: _main_index #this is a route to /
        logout:
            path: _main_logout #this is a route to /logout
            target: _main_index #this is a route to /
            invalidate_session: false

access_control:
    - { path: ^/news, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/registration, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/user-panel, roles: ROLE_ACTIVE_USER } #is this neccessary?

然后,当我登录到受限区域(/用户面板)时,我需要对自己进行完全身份验证。

我将我的角色存储在 security.yml 中,而不是在数据库中。

我希望你能帮助我!非常感谢!

编辑: 我的 loginCheckAction 看起来像这样::

        $encodedPassword = $this->get('user.user_service')->generatePasswordHash($user, $request->request->get('_password'));
        if ($user->getPassword() == $encodedPassword) {
            $user->setLastLoginOn(new \DateTime());
            $this->em->user($rocker);
            $this->em->flush();

            $token = new UsernamePasswordToken($user, $user->getPassword(), 'user_area', array($user->getRoles()));

            $request->getSession()->set('_security_user_area', serialize($token));

            return $this->redirect($this->generateUrl('_user_panel'));
        }

【问题讨论】:

  • 为什么两个防火墙具有相同的模式?这行不通
  • 我不知道这到底是如何工作的,但如果我删除 user_login 部分,网站甚至不会调用 loginCheckAction...
  • 我有这个。 user_login 需要自动登录(否则需要实现UserProviderInterface)。 user_area 实际上是关闭站点的防火墙。

标签: security authentication symfony login roles


【解决方案1】:

您需要添加一个需要身份验证的万能防火墙,如下所示:

   - { path: ^/,                   roles: ROLE_ACTIVE_USER }

这将使所有未明确列出的页面都无法访问,无需身份验证(即使用 IS_AUTHENTICATED_ANONYMOUSLY)。但是,由于您尚未列出您的主页,因此您也需要添加它。

   - { path: ^/$,                  roles: IS_AUTHENTICATED_ANONYMOUSLY }

确保将其放在 catch-all 条目之上,因为 Symfony 从上到下处理条目,并在找到匹配条目时停止。

【讨论】:

  • 如果我把这行 - { path: ^/$, roles: IS_AUTHENTICATED_ANONYMOUSLY } 然后这行 - { path: ^/, roles: ROLE_ACTIVE_USER } 我会收到一个 500 警报错误,我的分析器没有工作。
【解决方案2】:

您需要允许匿名令牌

user_area:
    pattern: ^/
    form_login:
        login_path: _main_index #this is a route to /
    logout:
        path: _main_logout #this is a route to /logout
        target: _main_index #this is a route to /
        invalidate_session: false
    anonymous: ~

【讨论】:

  • 我做了,但没有什么新东西... :(
  • 发生了什么然后你去/news
  • 这部分现在可以了,谢谢你,但我遇到了另一个问题 :) 在我的第一篇文章中查看我的编辑部分。
【解决方案3】:

试试这个。

    - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/registration, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/news, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/(css|js), roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/(_wdt|_profiler), roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/, roles: ROLE_ACTIVE_USER }

我认为 login_check 是 symfony 安全系统内部使用的,就像 logout 一样。这个空函数应该可以工作。

/**
 * @Route("/login_check", name="login_check")
 */
public function loginCheckAction()
{

}

如果你想在成功登录后将用户重定向到面板路由,你需要实现登录事件监听器。 Symfony 文档How to create an Event Listener.

symfony loginlistener 的一些资源。

http://www.ens.ro/2012/03/14/symfony2-login-event-listener/

https://gist.github.com/smottt/1075753

【讨论】:

  • 这可能很好,分析器错误不再出现!谢谢!但!在我的主帖中查看我的编辑部分。我粘贴了我的 loginCheckAction。当我登录时,我需要对自己进行完全身份验证,但是如果我在分析器中检查会话,我可以看到我需要对自己进行身份验证的那些数据。所以看起来我的身份验证不正确......
【解决方案4】:

首先,主要问题之一是同一路由上的多个防火墙。

Symfony 默认使用 /login 路由登录,使用 /login_check 检查凭据,默认使用 /logout 注销。对我来说,所有路由都很好,除了登录路由,因为我想从 / 路由登录用户。

因此,我不得不像这样在我的 UserRepository 中实现 UserProviderInterface:Authenticating Someone with a Custom Entity Provider - Symfony2 documentation

我只是在途中修改了这个(我使用电子邮件作为用户名)。

登录检查和注销是自动工作的,因为我使用默认路由。

对于所有这些,您必须为用户实体实现 AdvancedUserInterface!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 2012-03-26
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多