My code does not talk to another cluster as I have a single Tomcat only, but 
just wondering how one would scale.

Maybe the strategy to handle clusters is to write information, such as the list 
of the users to the number of times they have logged in in the last hour, into 
a location shared by all machines.  In my code below the code is stored in 
failedAttempts which is a Map<String /*username/*, FailedAttempt> where 
FailedAttempt represents the number of times the user has logged in in the last 
hour or whatever.  It is in-memory, which is fine for one Tomcat.

But we could move this Map into a file that is on a mounted drive available 
from all Tomcat machines, or we could store it in the database.  Either way we 
have to synchronize writes to the file or database, and I think database does 
this automatically, and maybe FileLock will do the job for the files.  But 
anyway, it sounds complicated.

As for my my authenticate it was as follows, although I don't see this should 
cause the failure in the subject of this email -- "Connection.close() has 
already been called during login":

   public Principal authenticate(String username, String credentials)
   {
      threadUserLockedOut.remove();
      long curTime = System.currentTimeMillis();
      FailedAttempt failedAttempt = failedAttempts.get(username);
      if (failedAttempt != null && 
failedAttempt.checkFailedAttemptsReached(curTime))
      {
         threadUserLockedOut.set(Boolean.TRUE);
         return null;
      }
      Principal result = super.authenticate(username, credentials);
      if (result == null)
      {
         if (failedAttempt != null)
         {
            failedAttempt.incNumFailedAttempts();
            if (failedAttempt.maxFailedAttemptsReached())
            {
               failedAttempt.setFirstFailedTime(curTime);
               logger.warn("User '" + username + "' is locked out after " + 
MAX_FAILED_ATTEMPTS + " failed attempts");
               threadUserLockedOut.set(Boolean.TRUE);
               return null;
            }
         }
         else
         {
            failedAttempt = new FailedAttempt(curTime);
            failedAttempts.put(username, failedAttempt);
         }
      }
      else
      {
         if (failedAttempt != null)
         {
            failedAttempts.remove(username);
         }
      }
      return result;
   }


--- On Mon, 1/23/12, Christopher Schultz <ch...@christopherschultz.net> wrote:

> From: Christopher Schultz <ch...@christopherschultz.net>
> Subject: Re: Connection.close() has already been called during login
> To: "Tomcat Users List" <users@tomcat.apache.org>
> Date: Monday, January 23, 2012, 12:15 PM
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> To whom it may concern,
> 
> On 1/23/12 2:54 PM, removeps-c...@yahoo.com
> wrote:
> > Sorry, I did not know about [LockOutRealm].  Will
> this class work
> > if you have many Tomcats on different machines
> (possibly load
> > balancing) so regardless of which exact machine the
> user is
> > directed to, lock realm will know the number of failed
> login
> > attempts on other machines?
> 
> No, neither this nor any other Tomcat realms are
> cluster-aware.
> 
> If you want to track authentication failures across a
> cluster, you
> could subclass LockOutRealm and override these methods:
> 
> - - isLocked
> - - unlock
> - - registerAuthFailure
> 
> This will allow you to handle the cluster-sync behavior
> separately
> from the authentication behavior which this class already
> handles.
> 
> I'm interested in seeing what you come up with for
> communicating with
> the rest of the cluster.
> 
> - -chris
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG/MacGPG2 v2.0.17 (Darwin)
> Comment: GPGTools - http://gpgtools.org
> Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/
> 
> iEYEARECAAYFAk8dv+4ACgkQ9CaO5/Lv0PDRnwCgvZFJvYXbU8Gwec6y430aD/rz
> Kk4An2C5ZwXZf4NEaS31A5CWngqGxI9F
> =zDyr
> -----END PGP SIGNATURE-----
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
> For additional commands, e-mail: users-h...@tomcat.apache.org
> 
>

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

Reply via email to