Symfony2 - Access for Login and Register page for Anonymous only not Users

acl, symfony

Solution

This may not be the best or proper way to do it, but its been the only way I could figure it out.

In my loginAction method I do this (see the $secured variable). If the user session is authenticated then I redirect them to the home/index page. I don't know of a way to do it via the firewall config because I don't believe the login page would ever have a firewall attached to it.

/**
 * @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()
    );
}

Problem

I have this website with a login form and after I successfully logged in, I am redirected to the index. But when I click the back button, it lets me still view the login form which is not good. I want only the login form to be accessible by anonymous viewers only and not users who have logged in already. Is there a simple way to do this in symfony2? thanks Here is my security.: ``` 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 } ```

Original source