/*
 * Copyright 2005-2008 Les Hazlewood
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.jsecurity.authc;

/**
 * An <tt>AuthenticationToken</tt> that indicates if the user wishes their identity to be remembered across sessions.
 *
 * <p>Please note however that when a new session is created for the corresponding user, that user's identity would be 
 * remembered, but they are <em>NOT</em> considered authenticated:
 *
 * <p>Authentication is the process of proving you are who you say you are.  In a RememberMe scenario, a remembered
 * identity gives the system an idea who that person probably is, but in reality, has no way of guaranteeing the
 * remembered identity <em>really</em> is that user.
 *
 * <p>So, although many parts of the application can still perform user-specific logic based on the remembered
 * identity, such as customized views, it should never perform security-sensitive operations until the user has
 * actually executed a successful authentication attempt.
 *
 * <p>We see this paradigm all over the web, and we'll use <tt>amazon.com</tt> as an example:
 *
 * <p>When you visit Amazon.com and perform a login and ask it to 'remember me', it will set a cookie with your
 * identity.  If you don't log out and your session expires, and you come back, say the next day, Amazon still knows
 * who you <em>probably</em> are: you still see all of your book and movie recommendations and similar user-specific
 * features since these are based on your (remembered) user id.</p>
 *
 * <p>BUT, if you try to do some sensitive operations, such as access your account's billing data, Amazon forces you
 * to do an actual log-in, requiring your username and password.
 *
 * <p>This is because although amazon.com assumed your identity from 'remember me', it recognized that you were not
 * actually authenticated.  The only way to really guarantee you are who you say you are, and therefore able to
 * access sensitive account data, is for you to perform an actual authentication.
 *
 * @author Les Hazlewood
 * @since 0.9
 */
public interface RememberMeAuthenticationToken extends AuthenticationToken {

    /**
     * Returns <tt>true</tt> if the submitting user wishes their identity (principal(s)) to be remembered
     * across sessions, <tt>false</tt> otherwise.
     *
     * <p>Please see the class-level JavaDoc for what 'remember me' vs. 'authenticated' means - they are semantically 
     * different.
     *
     * @return <tt>true</tt> if the submitting user wishes their identity (principal(s)) to be remembered
     * across sessions, <tt>false</tt> otherwise.
     */
    boolean isRememberMe();

}
