I'm trying to re-word these two concepts in a more elegant way:

1) I'm looking for a way to use form based authentication - but unlike with the current form login Realm, I need a way to intercept the persons email address(s) (typed into the username field), so that I can convert that into its corresponding username *before* passing it to the Realm (this cannot be done with the current form based login).

For this method, I would *prefer* not to write an override to any existing Realm (Form or WWW-Authenticate) - because users may already have their own. In other words, I would like to be able to call into whatever Realm the user already has configured (provided it's a user/pass one).

2) As an alternative, being able to simply register a given username (void doLogin(Principal p)) with a session via the server API would also be very useful - one could perform their own password or X509 validation inside of a servlet/jsp (using rules that are much more strict than what the current impls support, e.g trust levels/rules for issuers, and revocation checks, and critical subject flags for x509 certs). One could also implement the simplest possible (yet highly customizable) login logic against say, a database:

ResultSet rs = ps.exec("SELECT pass FROM auth WHERE user = ?"
        ,request.getParameter("user"));
if (Digest.sha1(request.getParameter("pass"))
        .equals(rs.getString("pwdSha"))
)
 Tomcat5.doLogin(session, new Principal(request.getParameter("user"));


I hope that these two (very different) concepts will be tantalizing enough that some highly simplified auth APIs/concepts will make their way into the server. I have tried to build the first one - but the protected request/response fields in CoyoteRequestFacade cannot be accessed from a external class, and reflection would be needed to cast/call the method. An 'expert' will do much better than I.

class Tomcat5:

public static boolean tryLogin(HttpServletRequest request, HttpServletRequest response, String user, String pass)
  throws Exception
{
  Server server = ServerFactory.getServer();
  Service service = server.findService("Catalina");
  if (service==null)
throw new NullPointerException("login: Cannot load Service 'Catalina'");
  Engine engine = (Engine) service.getContainer();
  if (engine==null)
throw new NullPointerException("login: Cannot load Container for Service 'Catalina'");

  Host host = null;
  String hostname = Strings.norm(request.getHeader("Host"));
  Object[] o = engine.findChildren();
  for (int i=0; i<o.length; i++)
  {
    if (!(o[i] instanceof Host))
      continue;
    Host h = (Host)o[i];
    String[] list = h.findAliases();
    for (int j=0; j<list.length; j++)
      if (hostname.equalsIgnoreCase(list[j]))
      {
        host = h;
        break;
      }
  }
  if (host==null)
throw new NullPointerException("login: Cannot load Host '"+hostname+"'");
  String reqbase  = Strings.norm(req.getContextPath())+"/";
  Context context = (Context) host.findChild(reqbase);
  if (context==null)
  {
    context = (Context) host.findChild(Strings.clip(reqbase,-1));
  }
  if (context==null)
throw new NullPointerException("login: Cannot load Context '"+reqbase+"'");
  Manager manager = context.getManager();
  HttpSession hses = request.getSession(true);
  Session session = null;
  try {
    session = manager.findSession(hses.getId());
  } catch (IOException e) {}
  if (session==null)
throw new NullPointerException("login: Cannot load Session '"+reqbase+"'");
  Realm realm = context.getRealm();
  LoginConfig config = context.getLoginConfig();
  FormAuthenticator auth = null;
  Pipeline pipe = context.getPipeline();
  Valve[] v = pipe.getValves();
  for (int i=0; i<v.length; i++)
  {
    if (v[i] instanceof Authenticator)
    {
      auth = (FormAuthenticator)v[i];
      //if (true)throw new NullPointerException(o[i].toString());
      break;
    }
  }
  if (auth==null)
throw new NullPointerException("login: Cannot load Authenticator '"+reqbase+"'");
  Principal principal = realm.authenticate(user, pass);
  if (principal==null)
    return false;
  session.setNote(Constants.FORM_PRINCIPAL_NOTE, principal);
  session.setNote(Constants.SESS_USERNAME_NOTE, user);
  session.setNote(Constants.SESS_PASSWORD_NOTE, pass);
if (true) throw new NullPointerException(request.getClass().toString()+" "+response.getClass().toString()); auth.authenticate(((CoyoteRequestFacade)request).request, ((CoyoteResponseFacade)response).response, config);
  return true;
}



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to