Symfony2锁定带防火墙的完整站点

时间:2013-07-27 18:02:28

标签: security authentication symfony login roles

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

/

/消息

/注册

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

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'));
        }

3 个答案:

答案 0 :(得分:0)

您需要允许匿名令牌

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: ~

答案 1 :(得分:0)

试试这个。

    - { 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

答案 2 :(得分:0)

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

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

因此,我必须将UserProviderInterface实现到我的UserRepository中,如下所示:Authenticating Someone with a Custom Entity Provider - Symfony2 documentation

我刚刚修改了这个(我用户名是用户名)。

Logincheck和logout自动运行,因为我使用默认路由。

对于所有这些,您必须实现AdvancedUserInterface到Users实体!!