craigmcc    00/12/15 17:42:49

  Modified:    catalina/src/share/org/apache/catalina/authenticator
                        AuthenticatorBase.java BasicAuthenticator.java
                        DigestAuthenticator.java FormAuthenticator.java
                        SSLAuthenticator.java
  Log:
  Refactor common code out of the authenticators and into the base class.
  As a side effect of this change, Catalina now (correctly) reports the
  cached userPrincipal and authType information for a previously
  authenticated user, even if the current request is not protected by a
  security constraint.
  
  Submitted by: Vivek Nagar <[EMAIL PROTECTED]>
  
  Revision  Changes    Path
  1.6       +60 -11    
jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/authenticator/AuthenticatorBase.java
  
  Index: AuthenticatorBase.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/authenticator/AuthenticatorBase.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- AuthenticatorBase.java    2000/10/29 00:35:04     1.5
  +++ AuthenticatorBase.java    2000/12/16 01:42:46     1.6
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/authenticator/AuthenticatorBase.java,v
 1.5 2000/10/29 00:35:04 craigmcc Exp $
  - * $Revision: 1.5 $
  - * $Date: 2000/10/29 00:35:04 $
  + * $Header: 
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/authenticator/AuthenticatorBase.java,v
 1.6 2000/12/16 01:42:46 craigmcc Exp $
  + * $Revision: 1.6 $
  + * $Date: 2000/12/16 01:42:46 $
    *
    * ====================================================================
    *
  @@ -116,7 +116,7 @@
    * requests.  Requests of any other type will simply be passed through.
    *
    * @author Craig R. McClanahan
  - * @version $Revision: 1.5 $ $Date: 2000/10/29 00:35:04 $
  + * @version $Revision: 1.6 $ $Date: 2000/12/16 01:42:46 $
    */
   
   
  @@ -419,6 +419,27 @@
                ((HttpServletRequest) request.getRequest()).getRequestURI());
        LoginConfig config = context.getLoginConfig();
   
  +        // Have we got a cached authenticated Principal to record?
  +        if (cache) {
  +            Principal principal =
  +                ((HttpServletRequest) request.getRequest()).getUserPrincipal();
  +            if (principal == null) {
  +                Session session = getSession(hrequest);
  +                if (session != null) {
  +                    principal = session.getPrincipal();
  +                    if (principal != null) {
  +                        if (debug >= 1)
  +                            log("We have cached auth type " +
  +                                session.getAuthType() +
  +                                " for principal " +
  +                                session.getPrincipal());
  +                        hrequest.setAuthType(session.getAuthType());
  +                        hrequest.setUserPrincipal(principal);
  +                    }
  +                }
  +            }
  +        }
  +
        // Special handling for form-based logins to deal with the case
        // where the login form (and therefore the "j_security_check" URI
        // to which it submits) might be outside the secured area
  @@ -450,6 +471,9 @@
        if (!checkUserData(hrequest, hresponse, constraint)) {
            if (debug >= 1)
                log(" Failed checkUserData() test");
  +            ((HttpServletResponse) hresponse.getResponse()).sendError
  +                (HttpServletResponse.SC_FORBIDDEN,
  +                 ((HttpServletRequest) hrequest.getRequest()).getRequestURI());
            return;
        }
   
  @@ -457,6 +481,8 @@
        if (!authenticate(hrequest, hresponse, config)) {
            if (debug >= 1)
                log(" Failed authenticate() test");
  +            // ASSERT: Authenticator already set the appropriate
  +            // HTTP status code, so we do not have to do anything special
            return;
        }
   
  @@ -464,6 +490,8 @@
        if (!accessControl(hrequest, hresponse, constraint)) {
            if (debug >= 1)
                log(" Failed accessControl() test");
  +            // ASSERT: Access control method has already set the appropriate
  +            // HTTP status code, so we do not have to do anything special
            return;
        }
   
  @@ -538,9 +566,12 @@
        if (roles == null)
            roles = new String[0];
        if (roles.length == 0) {
  -            if (constraint.getAuthConstraint())
  +            if (constraint.getAuthConstraint()) {
  +                ((HttpServletResponse) response.getResponse()).sendError
  +                    (HttpServletResponse.SC_FORBIDDEN,
  +                     sm.getString("authenticator.forbidden"));
                   return (false); // No listed roles means no access at all
  -            else
  +            } else
                   return (true);       // Authenticated user is sufficient
           }
        for (int i = 0; i < roles.length; i++) {
  @@ -818,21 +849,39 @@
   
   
       /**
  -     * Register an authenticated Principal with our SingleSignOn valve,
  -     * if there is one, and set the appropriate Cookie to be returned.
  +     * Register an authenticated Principal and authentication type in our
  +     * request, in the current session (if there is one), and with our
  +     * SingleSignOn valve, if there is one.  Set the appropriate cookie
  +     * to be returned.
        *
        * @param request The servlet request we are processing
        * @param response The servlet response we are generating
        * @param principal The authenticated Principal to be registered
        * @param authType The authentication type to be registered
        */
  -    protected void register(Request request, Response response,
  +    protected void register(HttpRequest request, HttpResponse response,
                               Principal principal, String authType) {
   
  -        if (sso == null)
  -            return;
  +        if (debug >= 1)
  +            log("Authenticated '" + principal.getName() + "' with type '"
  +                + authType + "'");
  +
  +        // Cache the authentication information in our request
  +        request.setAuthType(authType);
  +        request.setUserPrincipal(principal);
  +
  +        // Cache the authentication information in our session, if any
  +        if (cache) {
  +            Session session = getSession((HttpRequest) request);
  +            if (session != null) {
  +                session.setAuthType(authType);
  +                session.setPrincipal(principal);
  +            }
  +        }
   
           // Construct a cookie to be returned to the client
  +        if (sso == null)
  +            return;
           HttpServletRequest hreq =
               (HttpServletRequest) request.getRequest();
           HttpServletResponse hres =
  
  
  
  1.5       +6 -28     
jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/authenticator/BasicAuthenticator.java
  
  Index: BasicAuthenticator.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/authenticator/BasicAuthenticator.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- BasicAuthenticator.java   2000/10/18 18:15:50     1.4
  +++ BasicAuthenticator.java   2000/12/16 01:42:46     1.5
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/authenticator/BasicAuthenticator.java,v
 1.4 2000/10/18 18:15:50 craigmcc Exp $
  - * $Revision: 1.4 $
  - * $Date: 2000/10/18 18:15:50 $
  + * $Header: 
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/authenticator/BasicAuthenticator.java,v
 1.5 2000/12/16 01:42:46 craigmcc Exp $
  + * $Revision: 1.5 $
  + * $Date: 2000/12/16 01:42:46 $
    *
    * ====================================================================
    *
  @@ -84,7 +84,7 @@
    * and Digest Access Authentication."
    *
    * @author Craig R. McClanahan
  - * @version $Revision: 1.4 $ $Date: 2000/10/18 18:15:50 $
  + * @version $Revision: 1.5 $ $Date: 2000/12/16 01:42:46 $
    */
   
   public final class BasicAuthenticator
  @@ -145,27 +145,11 @@
        Principal principal =
            ((HttpServletRequest) request.getRequest()).getUserPrincipal();
        if (principal != null) {
  -            //            if (debug >= 1)
  -            //                log("Already authenticated '" + principal.getName() + 
"'");
  +            if (debug >= 1)
  +                log("Already authenticated '" + principal.getName() + "'");
            return (true);
           }
   
  -     // Have we got a cached authenticated Principal?
  -     Session session = null;
  -     if (cache)
  -         session = getSession(request);
  -     if (session != null) {
  -         principal = session.getPrincipal();
  -         if (principal != null) {
  -                //                if (debug >= 1)
  -                //                    log("Cached authentication for '" + 
principal.getName()
  -                //                        + "'");
  -             request.setAuthType(session.getAuthType());
  -             request.setUserPrincipal(principal);
  -             return (true);
  -         }
  -     }
  -
        // Validate any credentials already included with this request
        HttpServletRequest hreq =
            (HttpServletRequest) request.getRequest();
  @@ -175,12 +159,6 @@
        if (authorization != null) {
            principal = findPrincipal(authorization, context.getRealm());
            if (principal != null) {
  -                //                if (debug >= 1)
  -                //                    log("Authenticated '" + principal.getName() + 
"'");
  -             request.setAuthType(Constants.BASIC_METHOD);
  -             request.setUserPrincipal(principal);
  -             if (cache && (session != null))
  -                 session.setPrincipal(principal);
                   register(request, response, principal, Constants.BASIC_METHOD);
                return (true);
            }
  
  
  
  1.4       +4 -21     
jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/authenticator/DigestAuthenticator.java
  
  Index: DigestAuthenticator.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/authenticator/DigestAuthenticator.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- DigestAuthenticator.java  2000/10/18 18:15:51     1.3
  +++ DigestAuthenticator.java  2000/12/16 01:42:47     1.4
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/authenticator/DigestAuthenticator.java,v
 1.3 2000/10/18 18:15:51 craigmcc Exp $
  - * $Revision: 1.3 $
  - * $Date: 2000/10/18 18:15:51 $
  + * $Header: 
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/authenticator/DigestAuthenticator.java,v
 1.4 2000/12/16 01:42:47 craigmcc Exp $
  + * $Revision: 1.4 $
  + * $Date: 2000/12/16 01:42:47 $
    *
    * ====================================================================
    *
  @@ -88,7 +88,7 @@
    * 
    * @author Craig R. McClanahan
    * @author Remy Maucherat
  - * @version $Revision: 1.3 $ $Date: 2000/10/18 18:15:51 $
  + * @version $Revision: 1.4 $ $Date: 2000/12/16 01:42:47 $
    */
   
   public final class DigestAuthenticator
  @@ -221,19 +221,6 @@
        if (principal != null)
            return (true);
   
  -     // Have we got a cached authenticated Principal?
  -     Session session = null;
  -     if (cache)
  -         session = getSession(request);
  -     if (session != null) {
  -         principal = session.getPrincipal();
  -         if (principal != null) {
  -             request.setAuthType(session.getAuthType());
  -             request.setUserPrincipal(principal);
  -             return (true);
  -         }
  -     }
  -
        // Validate any credentials already included with this request
        HttpServletRequest hreq =
            (HttpServletRequest) request.getRequest();
  @@ -243,10 +230,6 @@
        if (authorization != null) {
            principal = findPrincipal(hreq, authorization, context.getRealm());
            if (principal != null) {
  -             request.setAuthType(Constants.DIGEST_METHOD);
  -             request.setUserPrincipal(principal);
  -             if (cache && (session != null))
  -                 session.setPrincipal(principal);
                   register(request, response, principal,
                            Constants.DIGEST_METHOD);
                return (true);
  
  
  
  1.5       +6 -21     
jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/authenticator/FormAuthenticator.java
  
  Index: FormAuthenticator.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/authenticator/FormAuthenticator.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- FormAuthenticator.java    2000/10/18 18:15:51     1.4
  +++ FormAuthenticator.java    2000/12/16 01:42:47     1.5
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/authenticator/FormAuthenticator.java,v
 1.4 2000/10/18 18:15:51 craigmcc Exp $
  - * $Revision: 1.4 $
  - * $Date: 2000/10/18 18:15:51 $
  + * $Header: 
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/authenticator/FormAuthenticator.java,v
 1.5 2000/12/16 01:42:47 craigmcc Exp $
  + * $Revision: 1.5 $
  + * $Date: 2000/12/16 01:42:47 $
    *
    * ====================================================================
    *
  @@ -88,7 +88,7 @@
    * Authentication, as described in the Servlet API Specification, Version 2.2.
    *
    * @author Craig R. McClanahan
  - * @version $Revision: 1.4 $ $Date: 2000/10/18 18:15:51 $
  + * @version $Revision: 1.5 $ $Date: 2000/12/16 01:42:47 $
    */
   
   public final class FormAuthenticator
  @@ -145,19 +145,6 @@
        if (principal != null)
            return (true);
   
  -     // Have we got a cached authenticated Principal?
  -     Session session = null;
  -     if (cache)
  -         session = getSession(request);
  -     if (session != null) {
  -         principal = session.getPrincipal();
  -         if (principal != null) {
  -             request.setAuthType(session.getAuthType());
  -             request.setUserPrincipal(principal);
  -             return (true);
  -         }
  -     }
  -
        // Acquire references to objects we will need to evaluate
        HttpServletRequest hreq =
            (HttpServletRequest) request.getRequest();
  @@ -166,6 +153,7 @@
        String contextPath = hreq.getContextPath();
        String requestURI = hreq.getRequestURI();
        response.setContext(request.getContext());
  +        Session session = null;
   
        // Is this a request for the login page itself?  Test here to avoid
        // displaying it twice (from the user's perspective) -- once because
  @@ -200,10 +188,7 @@
   
   
        // Restore this request and redirect to the original request URI
  -     request.setAuthType(Constants.FORM_METHOD);
  -     request.setUserPrincipal(principal);
  -     if (cache && (session != null))
  -         session.setPrincipal(principal);
  +        session = getSession(request, true);
           register(request, response, principal, Constants.FORM_METHOD);
        if (restoreRequest(request, session))
            return (true);              // Perform the original request
  
  
  
  1.5       +4 -24     
jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/authenticator/SSLAuthenticator.java
  
  Index: SSLAuthenticator.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/authenticator/SSLAuthenticator.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- SSLAuthenticator.java     2000/10/18 18:15:51     1.4
  +++ SSLAuthenticator.java     2000/12/16 01:42:47     1.5
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/authenticator/SSLAuthenticator.java,v
 1.4 2000/10/18 18:15:51 craigmcc Exp $
  - * $Revision: 1.4 $
  - * $Date: 2000/10/18 18:15:51 $
  + * $Header: 
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/authenticator/SSLAuthenticator.java,v
 1.5 2000/12/16 01:42:47 craigmcc Exp $
  + * $Revision: 1.5 $
  + * $Date: 2000/12/16 01:42:47 $
    *
    * ====================================================================
    *
  @@ -86,7 +86,7 @@
    * that utilizes SSL certificates to identify client users.
    *
    * @author Craig R. McClanahan
  - * @version $Revision: 1.4 $ $Date: 2000/10/18 18:15:51 $
  + * @version $Revision: 1.5 $ $Date: 2000/12/16 01:42:47 $
    */
   
   public final class SSLAuthenticator
  @@ -140,20 +140,6 @@
        if (principal != null)
            return (true);
   
  -     // Have we got a cached authenticated Principal?
  -        // FIXME - what if the user switches certificates in the SSLSession?
  -     Session session = null;
  -     if (cache)
  -         session = getSession(request);
  -     if (session != null) {
  -         principal = session.getPrincipal();
  -         if (principal != null) {
  -             request.setAuthType(session.getAuthType());
  -             request.setUserPrincipal(principal);
  -                return (true);
  -         }
  -     }
  -
           // Retrieve the certificate chain for this client
           if (debug >= 1)
               log(" Looking up certificates");
  @@ -187,12 +173,6 @@
           }
   
           // Cache the principal (if requested) and record this authentication
  -        if (debug >= 1)
  -            log(" Successfully identified '" + principal.getName() + "'");
  -        request.setAuthType(Constants.CERT_METHOD);
  -        request.setUserPrincipal(principal);
  -        if (cache && (session != null))
  -            session.setPrincipal(principal);
           register(request, response, principal, Constants.CERT_METHOD);
           return (true);
   
  
  
  

Reply via email to