7

我有一个带有登录表单的网站,成功登录后,我被重定向到索引。但是当我单击后退按钮时,它仍然让我查看登录表单,这是不好的。我只希望匿名查看者可以访问登录表单,而不是已经登录的用户。在 symfony2 中是否有一种简单的方法可以做到这一点?谢谢

这是我的安全:


    jms_security_extra:
    secure_all_services: false
    expressions: true

security:
    encoders:
        Mata\UserBundle\Entity\User: 
            algorithm:        sha1
            encode_as_base64: false
            iterations:   1

    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]


    providers:
        user_db:
            entity: { class: MataUserBundle:User,  property: username }

    firewalls:

        secured_area:
            pattern:    ^/
            anonymous: ~
            form_login:
                check_path: /login_check
                login_path: /login
            logout:
                path:   /logout
                target: /

    access_control:
    - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/, roles: ROLE_USER }
4

2 回答 2

5

这可能不是最好或正确的方法,但它是我能弄清楚的唯一方法。

在我的 loginAction 方法中,我执行此操作(请参阅 $secured 变量)。如果用户会话通过了身份验证,那么我将它们重定向到主页/索引页面。我不知道如何通过防火墙配置来做到这一点,因为我不相信登录页面会附加防火墙。

/**
 * @Route("/login", name="login")
 * @Template()
 */
public function loginAction()
{
    $request = $this->getRequest();
    $session = $request->getSession();

    // if the session is secured (user is logged in) 
    // then $secured will be an object with various user information.
    $secured = unserialize($session->get('_security_secured'));
    if ($secured) {
        return $this->redirect($this->generateUrl('home'));
    }

    // get the login error if there is one
    if ($request->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) {
        $error = $request->attributes->get(SecurityContext::AUTHENTICATION_ERROR);
    } else {
        $error = $session->get(SecurityContext::AUTHENTICATION_ERROR);
    }

    return array(
        'last_username' => $session->get(SecurityContext::LAST_USERNAME),
        'error'         => $error,
        'embed'         => $request->isXmlHttpRequest()
    );
}
于 2012-12-06T12:58:12.207 回答
1

使用 symfony 4,您可以使用 allow_if 解决它:

access_control:
- { path: /login, allow_if: "!is_authenticated()" }

这是 allow_if 字符串中可用的表达式列表 http://symfony.com/doc/current/security/expressions.html#security-expression-variables

于 2018-07-15T17:59:03.623 回答