Simple Intentions turn into Remember Me Login
I woke up this morning, and had the simple intention of blogging about one of my favorite tools, The Color Schemer. If you're a wanna-be designer like me, it's awesome. It helps you match "like" colors and also allows you to select any color on your screen. It's one of my most invaluable web design tools. Putting a tip about this was my only hope at 4:30 when I sat down at this computer. Now it's 5:39.
Why am I still here? I got caught up in reading the Colorado Bloggers mailing list - which actually got some traffic yesterday. This is one of the first times I've received a message from the list. One of the members pointed me to a another Photo Album for the web. It's called Gallery and she has an example setup. Looks like it runs on PHP. Well that shouldn't have taken me an hour, right?
The activity that's filled my last hour has been wrestling with Erik Hatcher's request for "remember me" functionality in a J2EE app, using container-managed security. The good news is that I did get it working - here's how:
- First, I added a checkbox called "rememberMe" to my login.jsp. When the user clicks "submit", I do some JavaScript logic. This logic entails saving the username and password as cookies - but only if the rememberMe checkbox is checked. If rememberMe is checked, a cookie is set called "rememberMe" with a value of "true."
- Using Roller's BreadCrumbFiler (maps to /*), I added some logic to check for the existence of the "rememberMe" cookie, and if it exists, to route the user to "j_security_check?j_username="+usernameCookie+"&j_password="+passwordCookie.
This all worked fine and dandy right off the bat - took me about 10 minutes to implement. The problem was that a user couldn't "logout." So I've spent the last hour (now it's been an hour and 1/2) with my own ignorance trying to delete cookies (and doing null checks and such) so users could logout. And I just got it working - fricken sweet! What a way to start the day! The only problem I could see now is if a user tries a username/password and selects "remember me", but then closes their browser. The BreadCrumbFilter will keep trying to authenticate them - yep, I just verified that that's a problem. It's also a problem when they enter an invalid password and select rememberMe.
One way to solve this is to not set the "rememberMe" and "password" cookies until someone has successfully authenticated. Maybe I could use the breadcrumbs in the BreadCrumbFilter to check the last URL accessed, and if it's already j_security_check, don't do the routing. Anyway, here's the code that does the heavy lifting in BreadCrumbFilter:
Cookie rememberMe = RequestUtil.getCookie(request, "rememberMe"); // check to see if the user is logging out, if so, remove the // rememberMe cookie and password Cookie if (request.getRequestURL().indexOf("logout") != -1 && (rememberMe != null)) { if (log.isDebugEnabled()) { log.debug("deleting rememberMe-related cookies"); } response = RequestUtil.deleteCookie(response, RequestUtil.getCookie(request, "rememberMe")); response = RequestUtil.deleteCookie(response, RequestUtil.getCookie(request, "password")); } if (request.getRequestURL().indexOf("login") != -1) { // container is routing user to login page, check for remember me cookie Cookie username = RequestUtil.getCookie(request, "username"); Cookie password = RequestUtil.getCookie(request, "password"); if ((rememberMe != null) && (password != null)) { // authenticate user without displaying login page String route = "j_security_check?j_username=" + RequestUtils.encodeURL(username.getValue()) + "&j_password=" + RequestUtils.encodeURL(password.getValue()); if (log.isDebugEnabled()) { log.debug("I remember you '" + username.getValue() + "', authenticating..."); } response.sendRedirect(response.encodeRedirectURL(route)); return; } }
I can post the code for RequestUtil if you need it. The class RequestUtils (for encoding URLs) is a Struts class.
Posted by Erik Hatcher on January 14, 2003 at 01:48 PM MST #
Posted by Erik Hatcher on January 14, 2003 at 01:51 PM MST #
Posted by Matt Raible on January 14, 2003 at 03:10 PM MST #
Posted by peter on February 21, 2003 at 07:40 PM MST #