1. I think the AuthenticatoBase#cache flag should be honored.

That is: I think session.setPrincipal() should not be called unless
the flag is true.

I wonder whether we can call AuthenticatoBase#register(), like
FormAuthenticator does. The #register() method honors the cache flag,
but a problem is that it updates sso information.

The cache flag is true by default, so that does not change anything for OP.

2. Constants.FORM_PRINCIPAL_NOTE is specific to FormAuthenticator.
Should it be used here?

Though it seems there is no direct harm from that.

3. Javadoc formatting for the method needs some <p> and <ul>.



2011/12/28  <ma...@apache.org>:
> Author: markt
> Date: Tue Dec 27 20:17:00 2011
> New Revision: 1225000
>
> URL: http://svn.apache.org/viewvc?rev=1225000&view=rev
> Log:
> Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=52303
> Allow web applications that do not have a login configuration to
> participate in a SSO session. Patch provided by Brian Burch.
>
> Modified:
>    
> tomcat/trunk/java/org/apache/catalina/authenticator/NonLoginAuthenticator.java
>
> Modified: 
> tomcat/trunk/java/org/apache/catalina/authenticator/NonLoginAuthenticator.java
> URL: 
> http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/authenticator/NonLoginAuthenticator.java?rev=1225000&r1=1224999&r2=1225000&view=diff
> ==============================================================================
> --- 
> tomcat/trunk/java/org/apache/catalina/authenticator/NonLoginAuthenticator.java
>  (original)
> +++ 
> tomcat/trunk/java/org/apache/catalina/authenticator/NonLoginAuthenticator.java
>  Tue Dec 27 20:17:00 2011
> @@ -18,11 +18,13 @@ package org.apache.catalina.authenticato
>
>
>  import java.io.IOException;
> +import java.security.Principal;
>
>  import javax.servlet.http.HttpServletResponse;
>
>  import org.apache.catalina.connector.Request;
>  import org.apache.catalina.deploy.LoginConfig;
> +import org.apache.catalina.Session;
>
>
>
> @@ -40,16 +42,42 @@ public final class NonLoginAuthenticator
>
>
>     /**
> -     * Authenticate the user making this request, based on the specified
> -     * login configuration.  Return <code>true</code> if any specified
> -     * constraint has been satisfied, or <code>false</code> if we have
> -     * created a response challenge already.
> +     * Authenticate the user making this request, based on the fact that no
> +     * <code>login-config</code> has been defined for the container.
>      *
> -     * @param request Request we are processing
> -     * @param response Response we are populating
> -     * @param config    Login configuration describing how authentication
> -     *              should be performed
> +     * This implementation means "login the user even though there is no
> +     * self-contained way to establish a security Principal for that user".
> +     *
> +     * This method is called by the AuthenticatorBase super class to
> +     * establish a Principal for the user BEFORE the container security
> +     * constraints are examined, i.e. it is not yet known whether the user
> +     * will eventually be permitted to access the requested resource.
> +     * Therefore, it is necessary to always return <code>true</code> to
> +     * indicate the user has not failed authentication.
>      *
> +     * There are two cases:
> +     *
> +     *  - without SingleSignon: a Session instance does not yet exist
> +     *    and there is no <code>auth-method</code> to authenticate the
> +     *    user, so leave Request's Principal as null.
> +     *    note: AuthenticatorBase will later examine the security constraints
> +     *          to determine whether the resource is accessible by a user
> +     *          without a security Principal and Role (i.e. unauthenticated).
> +     *
> +     * - with SingleSignon: if the user has already authenticated via
> +     *   another container (using its own login configuration), then
> +     *   associate this Session with the SSOEntry so it inherits the
> +     *   already-established security Principal and associated Roles.
> +     *   note: This particular session will become a full member of the
> +     *         SingleSignOnEntry Session collection and so will potentially
> +     *         keep the SSOE "alive", even if all the other properly
> +     *         authenticated Sessions expire first... until it expires too.
> +     *
> +     * @param request  Request we are processing
> +     * @param response Response we are creating
> +     * @param config   Login configuration describing how authentication
> +     *                 should be performed
> +     * @return boolean to indicate whether the user is authenticated
>      * @exception IOException if an input/output error occurs
>      */
>     @Override
> @@ -58,24 +86,51 @@ public final class NonLoginAuthenticator
>                                 LoginConfig config)
>         throws IOException {
>
> -        /*  Associating this request's session with an SSO would allow
> -            coordinated session invalidation, but should the session for
> -            a webapp that the user didn't log into be invalidated when
> -            another session is logged out?
> -        String ssoId = (String) request.getNote(Constants.REQ_SSOID_NOTE);
> -        if (ssoId != null)
> -            associate(ssoId, getSession(request, true));
> -        */
> -
> -        if (containerLog.isDebugEnabled()) {
> -            containerLog.debug("User authentication is not required");
> +        Principal principal = request.getUserPrincipal();
> +        if (principal != null) {
> +            // excellent... we have already authenticated the client somehow,
> +            // probably from another container that has a login-config
> +            if (containerLog.isDebugEnabled())
> +                containerLog.debug("Already authenticated as '"
> +                          + principal.getName() + "'");
> +
> +            // create a new session (only if necessary)
> +            Session session = request.getSessionInternal(true);
> +
> +            // save the inherited Principal (if necessary) in this
> +            // session so it can remain authenticated until it expires
> +            session.setPrincipal(principal);
> +            session.setNote(Constants.FORM_PRINCIPAL_NOTE, principal);
> +
> +            // is there an SSO session cookie?
> +            String ssoId =
> +                    (String) request.getNote(Constants.REQ_SSOID_NOTE);
> +            if (ssoId != null) {
> +                if (containerLog.isDebugEnabled())
> +                    containerLog.debug("User authenticated by existing SSO");
> +                // Associate session with the existing SSO ID if necessary
> +                associate(ssoId, session);
> +            }
> +            // user was already authenticated, with or without a cookie
> +            return true;
>         }
> -        return (true);
> -
>
> +        // No Principal means the user is not already authenticated
> +        // and so will not be assigned any roles. It is safe to
> +        // to say the user is now authenticated because access to
> +        // protected resources will only be allowed with a matching role.
> +        // i.e. SC_FORBIDDEN (403 status) will be generated later.
> +
> +        if (containerLog.isDebugEnabled())
> +            containerLog.debug("User authenticated without any roles");
> +        return true;
>     }
>
>
> +    /**
> +     * Return the authentication method, which is vendor-specific and
> +     * not defined by HttpServletRequest.
> +     */
>     @Override
>     protected String getAuthMethod() {
>         return "NONE";
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
> For additional commands, e-mail: dev-h...@tomcat.apache.org
>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to