Author: ssenrogn
Date: 2007-08-21 15:54:03 +0200 (Tue, 21 Aug 2007)
New Revision: 5651
Modified:
branches/2.15-personalization/war/src/main/java/no/sesat/search/http/filters/UserFilter.java
Log:
Updated filter to work with the new login regime.
Modified:
branches/2.15-personalization/war/src/main/java/no/sesat/search/http/filters/UserFilter.java
===================================================================
---
branches/2.15-personalization/war/src/main/java/no/sesat/search/http/filters/UserFilter.java
2007-08-21 13:39:00 UTC (rev 5650)
+++
branches/2.15-personalization/war/src/main/java/no/sesat/search/http/filters/UserFilter.java
2007-08-21 13:54:03 UTC (rev 5651)
@@ -1,17 +1,18 @@
/* Copyright (2007) Schibsted Søk AS
* This file is part of SESAT.
* You can use, redistribute, and/or modify it, under the terms of the SESAT
License.
- * You should have received a copy of the SESAT License along with this
program.
+ * You should have received a copy of the SESAT License along with this
program.
* If not, see https://dev.sesat.no/confluence/display/SESAT/SESAT+License
* UserFilter.java
*
* Created on 9 March 2007, 15:25
*/
-
package no.sesat.search.http.filters;
import java.io.IOException;
+import java.util.Date;
import java.util.Properties;
+
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.Filter;
@@ -20,20 +21,24 @@
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
-import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
+
+import no.schibstedsok.searchportal.user.BasicUser;
+import no.schibstedsok.searchportal.user.exception.InvalidTokenException;
+import no.schibstedsok.searchportal.user.service.BasicUserService;
+import no.schibstedsok.searchportal.user.service.UserCookieUtil;
import no.sesat.search.datamodel.DataModel;
import no.sesat.search.site.config.SiteConfiguration;
-import no.schibstedsok.searchportal.user.UserCookie;
-import no.schibstedsok.searchportal.user.service.UserService;
+
import org.apache.log4j.Logger;
-/** Responsible for Persistent User Login.
- * Or "Remember Me" functionality.
- * Based off
http://fishbowl.pastiche.org/2004/01/19/persistent_login_cookie_best_practice
+/**
+ * Responsible for Persistent User Login. Or "Remember Me" functionality.
Based off
+ *
http://fishbowl.pastiche.org/2004/01/19/persistent_login_cookie_best_practice
*
+ * @author <a href="mailto:[EMAIL PROTECTED]">Endre Midtgård Meckelborg</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Mck</a>
* @version <tt>$Id$</tt>
*/
@@ -43,65 +48,49 @@
private static final Logger LOG = Logger.getLogger(UserFilter.class);
- private static final String USER_COOKIE_KEY ="SesamUser";
- private static final String USER_COOKIE_PATH = "/";
-
// Attributes ----------------------------------------------------
// Static --------------------------------------------------------
-
// Constructors --------------------------------------------------
- /**
- *
- */
+ /** Default constructor. */
public UserFilter() {
+ super();
}
-
// Public --------------------------------------------------------
/**
+ * The filter action method.
*
* @param request The servlet request we are processing
- * @param response
+ * @param response The servlet response for the request
* @param chain The filter chain we are processing
- *
- * @exception IOException if an input/output error occurs
- * @exception ServletException if a servlet error occurs
+ * @exception IOException Thrown if an input/output error occurs
+ * @exception ServletException Thrown if a servlet error occurs
*/
- public void doFilter(
- final ServletRequest request,
- final ServletResponse response,
- final FilterChain chain)
- throws IOException, ServletException {
+ public void doFilter(final ServletRequest request, final ServletResponse
response, final FilterChain chain)
+ throws IOException, ServletException {
+ if (request instanceof HttpServletRequest) {
+ initialiseUserCookie((HttpServletRequest) request,
(HttpServletResponse) response);
+ performAutomaticLogin((HttpServletRequest) request,
(HttpServletResponse) response);
- if(request instanceof HttpServletRequest){
- final HttpServletRequest httpRequest = (HttpServletRequest)request;
-
- initialiseUserCookie(httpRequest, (HttpServletResponse)response);
-
- performAutomaticLogin(httpRequest, (HttpServletResponse)response);
-
chain.doFilter(request, response);
-
- }else{
+ } else {
chain.doFilter(request, response);
}
}
/**
- * Destroy method for this filter
- *
+ * Destroy method for this filter.
*/
public void destroy() {
}
/**
- * Init method for this filter
- *
+ * Init method for this filter.
*/
public void init(final FilterConfig filterConfig) {
}
@@ -112,94 +101,103 @@
// Private -------------------------------------------------------
- /** Look for a User cookie.
- * Can return null. **/
- private static Cookie getUserCookie(final HttpServletRequest request){
-
- // Look in attributes (it could have already been updated this request)
- if( null != request ){
-
- // Look through cookies
- if( null != request.getCookies() ){
- for( Cookie c : request.getCookies()){
- if( c.getName().equals( USER_COOKIE_KEY ) ){
- return c;
- }
- }
- }
- }
-
- return null;
- }
-
- private static void performAutomaticLogin(
- final HttpServletRequest request,
- final HttpServletResponse response){
-
+ /**
+ * Method that populate the user datamodel if no user is set and there
exists a login cookie.
+ *
+ * @param request The servlet request we are processing
+ * @param response The servlet response for the request
+ */
+ private static void performAutomaticLogin(final HttpServletRequest
request, final HttpServletResponse response) {
final HttpSession session = request.getSession();
final DataModel datamodel = (DataModel)
session.getAttribute(DataModel.KEY);
- if(null == datamodel.getUser().getUser()){
+ final BasicUserService userService = getBasicUserService(datamodel);
- final Cookie cookie = getUserCookie(request);
- if(null != cookie && !"0".equals(cookie.getValue())){
+ if (userService == null) {
+ LOG.warn("Couldn't find the user service.");
+ return;
+ }
- // lookup the ejb3-client service
- final SiteConfiguration siteConf =
datamodel.getSite().getSiteConfiguration();
- final String url =
siteConf.getProperty("schibstedsok_remote_service_url");
- final String jndi =
siteConf.getProperty("user_service_jndi_name");
+ final String loginKey = UserCookieUtil.getUserLoginCookie(request);
+ final Date updateTimestamp =
UserCookieUtil.getUserUpdateCookie(request);
- LOG.info("Url: " + url);
- LOG.info("JNDI_NAME: " + jndi);
+ BasicUser user = datamodel.getUser().getUser();
- final Properties properties = new Properties();
- properties.put("java.naming.factory.initial",
"org.jnp.interfaces.NamingContextFactory");
- properties.put("java.naming.factory.url.pkgs",
"org.jboss.naming:org.jnp.interfaces");
- properties.put("java.naming.provider.url", url);
+ if (user == null && userService.isLegalLoginKey(loginKey)) {
+ // Login if no user and a legal login key.
+ LOG.info("Login key found, logs user in: " + loginKey);
+ user = loginUsingCookie(loginKey, response, userService);
+ datamodel.getUser().setUser(user);
+ } else if (user != null && !userService.isLegalLoginKey(loginKey)) {
+ // Check if the user should be logged out.
+ LOG.info("No legal login key found, logs the user out: " +
user.getUsername());
+ datamodel.getUser().setUser(null);
+ } else if (user != null && user.isDirty(updateTimestamp)) {
+ // Check if the user object is dirty, refresh if needed.
+ LOG.info("Logged in user dirty, refreshes: " + user.getUsername());
+ user = userService.refreshUser(user);
+ datamodel.getUser().setUser(user);
+ }
+ }
- try{
+ /**
+ * Place a cookie into the response so any subsequent requests can trust
that cookies are enabled.
+ *
+ * @param request The servlet request we are processing
+ * @param response The servlet response for the request
+ */
+ private static void initialiseUserCookie(final HttpServletRequest request,
final HttpServletResponse response) {
+ final String loginCookie = UserCookieUtil.getUserLoginCookie(request);
- final InitialContext ctx = new InitialContext(properties);
- final UserService service = (UserService) ctx.lookup(jndi);
+ if (loginCookie == null) {
+ // The user is not logged in
+ // Place the cookie, so we can test cookies are enabled
+ UserCookieUtil.setUserLoginCookieDefault(response);
+ }
+ }
- // perform the login
- final String automatedLoginKey = cookie.getValue();
+ private static BasicUser loginUsingCookie(final String loginKey, final
HttpServletResponse response,
+ final BasicUserService userService) {
+ BasicUser user;
- final UserCookie userCookie =
service.getUserByAutomaticId(automatedLoginKey);
- datamodel.getUser().setUser(userCookie.getUser());
+ try {
+ user = userService.authenticateByLoginKey(loginKey);
- // update the UserCookie ready for next automaticLogin
-
response.addCookie(createUserCookie(userCookie.getAutomaticId()));
-
- }catch(NamingException ne){
- LOG.error(ne.getMessage(), ne);
- }
+ if (user != null) {
+ // Updates the login cookie.
+ UserCookieUtil.setUserLoginCookie(response,
user.getNextLoginKey());
}
+ } catch (final InvalidTokenException e) {
+ // TODO: Give message to user?
+ LOG.warn("Invalid token in login key:" + loginKey);
+ user = null;
+ UserCookieUtil.setUserLoginCookieDefault(response);
}
+
+ return user;
}
- /** Place a cookie into the response so on any subsequent requests can
cookies are enabled.
- **/
- private static void initialiseUserCookie(
- final HttpServletRequest request,
- final HttpServletResponse response){
+ private static BasicUserService getBasicUserService(final DataModel
datamodel) {
+ // lookup the ejb3-client service
+ final SiteConfiguration siteConf =
datamodel.getSite().getSiteConfiguration();
+ final String url =
siteConf.getProperty("schibstedsok_remote_service_url");
+ final String jndi = siteConf.getProperty("user_service_jndi_name");
- final Cookie cookie = getUserCookie(request);
+ LOG.info("Url: " + url);
+ LOG.info("JNDI_NAME: " + jndi);
- if( cookie == null ){
- // The user is not logged in
- // Place the cookie, so we can test cookies are enabled
- response.addCookie(createUserCookie("0"));
+ final Properties properties = new Properties();
+ properties.put("java.naming.factory.initial",
"org.jnp.interfaces.NamingContextFactory");
+ properties.put("java.naming.factory.url.pkgs",
"org.jboss.naming:org.jnp.interfaces");
+ properties.put("java.naming.provider.url", url);
+
+ try {
+ final InitialContext ctx = new InitialContext(properties);
+ return (BasicUserService) ctx.lookup(jndi);
+ } catch (final NamingException ne) {
+ LOG.error(ne.getMessage(), ne);
+ return null;
}
}
- private static Cookie createUserCookie(final String content){
-
- final Cookie cookie = new Cookie(USER_COOKIE_KEY, content);
- cookie.setPath(USER_COOKIE_PATH);
- cookie.setMaxAge(Integer.MAX_VALUE);
-
- return cookie;
- }
-
}
_______________________________________________
Kernel-commits mailing list
[email protected]
http://sesat.no/mailman/listinfo/kernel-commits