0

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

/

/消息

/登记

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

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

4 回答 4

1

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

   - { path: ^/,                   roles: ROLE_ACTIVE_USER }

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

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

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

于 2013-07-27T18:09:51.840 回答
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: ~
于 2013-07-27T19:28:23.333 回答
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 文档 如何创建事件监听器

symfony loginlistener 的一些资源。

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

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

于 2013-07-28T07:01:41.777 回答
0

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

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

因此,我不得不像这样在我的 UserRepository 中实现 UserProviderInterface:使用自定义实体提供程序验证某人 - Symfony2 文档

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

Logincheck 和 logout 会自动工作,因为我使用默认路由。

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

于 2013-07-29T17:11:39.017 回答