7

このWebサイトにはログインフォームがあり、正常にログインすると、インデックスにリダイレクトされます。しかし、戻るボタンをクリックすると、ログインフォームが表示されたままになります。ログインフォームのみに匿名の閲覧者のみがアクセスできるようにし、すでにログインしているユーザーにはアクセスできないようにします。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メソッドでこれを行います($ secure変数を参照)。ユーザーセッションが認証されている場合は、ホームページ/インデックスページにリダイレクトします。ログインページにファイアウォールが接続されているとは思わないため、ファイアウォール構成を介してそれを行う方法がわかりません。

/**
 * @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 に答える