Return-Path: Delivered-To: apmail-jakarta-cactus-user-archive@apache.org Received: (qmail 44112 invoked from network); 12 Sep 2002 11:58:09 -0000 Received: from unknown (HELO nagoya.betaversion.org) (192.18.49.131) by daedalus.apache.org with SMTP; 12 Sep 2002 11:58:09 -0000 Received: (qmail 10642 invoked by uid 97); 12 Sep 2002 11:58:35 -0000 Delivered-To: qmlist-jakarta-archive-cactus-user@jakarta.apache.org Received: (qmail 10587 invoked by uid 97); 12 Sep 2002 11:58:34 -0000 Mailing-List: contact cactus-user-help@jakarta.apache.org; run by ezmlm Precedence: bulk List-Unsubscribe: List-Subscribe: List-Help: List-Post: List-Id: "Cactus Users List" Reply-To: "Cactus Users List" Delivered-To: mailing list cactus-user@jakarta.apache.org Received: (qmail 10399 invoked by uid 98); 12 Sep 2002 11:58:33 -0000 X-Antivirus: nagoya (v4218 created Aug 14 2002) Message-ID: From: "Robertson, Jason" To: 'Cactus Users List' Subject: Form Authentication Date: Thu, 12 Sep 2002 07:57:51 -0400 MIME-Version: 1.0 X-Mailer: Internet Mail Service (5.5.2653.19) Content-Type: multipart/mixed; boundary="----_=_NextPart_000_01C25A53.9EE0C030" X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N ------_=_NextPart_000_01C25A53.9EE0C030 Content-Type: text/plain; charset="iso-8859-1" Here's a FormAuthentication implementation that doesn't need any rework of the standard flow. The only modification needed to make this compile is to make the base class AbstractAuthentication's member variables 'theName' and 'thePassword' protected instead of private. This is a first pass. It's short on comments, and has some debugging code temporarily commented out, but it works. At least for me, on WebLogic 7.0. :) I'll comment it and express some minor concerns especially with regards to various app servers in the coming days, but I thought I'd throw this out now. I tried to include a sample ear that has a basic example, but the war's lib directory is too big and it bounced. So I've included the project, just adjust the jar file properties in build.xml to make it all work. Jason ------_=_NextPart_000_01C25A53.9EE0C030 Content-Type: application/octet-stream; name="FormAuthentication.java" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="FormAuthentication.java" package org.apache.cactus.client.authentication; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLEncoder; import java.util.StringTokenizer; import org.apache.cactus.WebRequest; import org.apache.cactus.client.HttpClientConnectionHelper; import org.apache.cactus.util.Configuration; public class FormAuthentication extends AbstractAuthentication { private URL securityCheckURL =3D null; private String sessionIdCookieName =3D null; private String sessionId =3D null; =20 public FormAuthentication(String theName, String thePassword) { super(theName, thePassword); } =20 protected void validateName(String theName) { name =3D URLEncoder.encode(theName); } =20 protected void validatePassword(String thePassword) { password =3D URLEncoder.encode(thePassword); } /** * @see AbstractAuthentication#configure(WebRequest) */ public void configure(WebRequest theRequest) { if (sessionId =3D=3D null) { authenticate(); } =20 if ((sessionId !=3D null) && (! sessionId.equals(""))) { theRequest.addCookie(sessionIdCookieName, sessionId); } } =20 public void setSecurityCheckURL(URL theUrl) { securityCheckURL =3D theUrl; } =20 public URL getSecurityCheckURL() { return securityCheckURL; } =20 public void authenticate() { try { String url =3D Configuration.getContextURL() + = "/j_security_check"; HttpClientConnectionHelper helper =3D new = HttpClientConnectionHelper(url); WebRequest request =3D new WebRequest(); request.addParameter("j_username", getName(), = WebRequest.POST_METHOD); request.addParameter("j_password", getPassword(), = WebRequest.POST_METHOD); HttpURLConnection connection =3D helper.connect(request); =20 sessionId =3D null; String cookies =3D connection.getHeaderField("Set-Cookie"); if (cookies !=3D null) { StringTokenizer st =3D new StringTokenizer(cookies, = "&"); while (st.hasMoreTokens()) { String cookie =3D st.nextToken(); StringTokenizer st2 =3D new StringTokenizer(cookie, = ";"); String nameValue =3D st2.nextToken(); StringTokenizer st3 =3D new = StringTokenizer(nameValue, "=3D"); String name =3D st3.nextToken(); if (name.equalsIgnoreCase("JSESSIONID")) { sessionIdCookieName =3D name; sessionId =3D st3.nextToken(); break; } } } else { // ??? System.out.println("No Cookies Returned!"); } //System.out.println("Response code: " + connection.getResponseCode()); //print(connection); if (connection.getResponseCode() !=3D 302) { throw new IllegalArgumentException("Unable to login, = probably due to bad username/password."); } =20 /* String location =3D connection.getHeaderField("Location"); if (location !=3D null) { int index =3D location.indexOf(";"); if (index !=3D -1) location =3D location.substring(0, = index); if (! location.equals(Configuration.getContextURL())) { throw new IllegalArgumentException("Unable to = login, probably due to bad username/password."); } } else { int i =3D 0; String key =3D connection.getHeaderFieldKey(i++); while (key !=3D null) { System.out.println(key + ": " + connection.getHeader= Field(key)); key =3D connection.getHeaderFieldKey(i++); } } */ } catch (Throwable e) { // This is to deal with some weirdness with the = HttpURLConnection impl, // because the compiler complains the connect call above = throws a "Throwable" // and must be caught. If anything happends we'll just turn = it into // a runtime exception. throw new IllegalStateException(e.getClass() + ": " + = e.getMessage()); } } =20 private void print(HttpURLConnection connection) { try { java.io.InputStream in =3D connection.getInputStream(); =20 byte[] buf =3D new byte[1000]; int num =3D in.read(buf); while (num !=3D -1) { System.out.println(new String(buf, 0, num)); num =3D in.read(buf); } } catch (java.io.IOException e) { System.out.println(e); } } } ------_=_NextPart_000_01C25A53.9EE0C030 Content-Type: application/octet-stream; name="SimpleFormLogin.zip" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="SimpleFormLogin.zip" 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 EwATAIUEAACAFQAAAAA= ------_=_NextPart_000_01C25A53.9EE0C030 Content-Type: text/plain; charset=us-ascii -- To unsubscribe, e-mail: For additional commands, e-mail: ------_=_NextPart_000_01C25A53.9EE0C030--