WLSSessionEnforcementServletFilter.java :  » Authentication-Authorization » josso-1.8 » org » josso » wls92 » agent » Java Open Source

Java Open Source » Authentication Authorization » josso 1.8 
josso 1.8 » org » josso » wls92 » agent » WLSSessionEnforcementServletFilter.java
/*
 * JOSSO: Java Open Single Sign-On
 *
 * Copyright 2004-2009, Atricore, Inc.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */

package org.josso.wls92.agent;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.josso.agent.Lookup;
import org.josso.agent.LocalSession;
import org.josso.agent.SSOAgentRequest;
import org.josso.gateway.session.exceptions.FatalSSOSessionException;
import org.josso.servlet.agent.GenericServletLocalSession;
import org.josso.servlet.agent.GenericServletSSOAgentRequest;
import weblogic.servlet.security.ServletAuthentication;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.IOException;

/**
 * Servlet Filter that will assert container-authenticated SSO sessions. This filter must be enabled for
 * keeping JOSSO intercepting authenticated requests.
 *
 * @author <a href="mailto:gbrigand@josso.org">Gianluca Brigandi</a>
 */
public class WLSSessionEnforcementServletFilter implements Filter {

    private static final Log log = LogFactory.getLog(org.josso.wls92.agent.WLSSessionEnforcementServletFilter.class);

    /**
     * One agent instance for all applications.
     */
    private WLSSSOAgent _agent;

    /**
     * Logger
     */
    public WLSSessionEnforcementServletFilter() {

    }

    public void init(FilterConfig filterConfig) throws ServletException {
        // Validate and update our current component state
        ServletContext ctx = filterConfig.getServletContext();

        if (_agent == null) {

            try {

                Lookup lookup = Lookup.getInstance();
                lookup.init("josso-agent-config.xml"); // For spring compatibility ...

                // We need at least an abstract SSO Agent
                _agent = (WLSSSOAgent) lookup.lookupSSOAgent();
                _agent.start();

                // Enable debug if we use debug ....
                if (log.isDebugEnabled()) _agent.setDebug(1);

            } catch (Exception e) {
                throw new ServletException("Error starting SSO Agent : " + e.getMessage(), e);
            }

        }

    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {


        HttpServletRequest hreq =
                (HttpServletRequest)request;

        HttpServletResponse hres =
                (HttpServletResponse) response;

        HttpSession session = hreq.getSession(true);

        if (log.isDebugEnabled())
            log.debug("Processing : " + hreq.getContextPath());


        // ------------------------------------------------------------------
        // Check for the single sign on cookie
        // ------------------------------------------------------------------
        if (log.isDebugEnabled())
            log.debug("Checking for SSO cookie");
        Cookie cookie = null;
        Cookie cookies[] = hreq.getCookies();
        if (cookies == null)
            cookies = new Cookie[0];
        for (int i = 0; i < cookies.length; i++) {
            if (org.josso.gateway.Constants.JOSSO_SINGLE_SIGN_ON_COOKIE.equals(cookies[i].getName())) {
                cookie = cookies[i];
                break;
            }
        }
        if (cookie != null && !cookie.getValue().equals("-")) {

            String jossoSessionId = cookie.getValue();

            if (log.isDebugEnabled())
                log.debug("asserting SSO session for : " + jossoSessionId);

            SSOAgentRequest sessionAssertionRequest;

            sessionAssertionRequest = doMakeSSOAgentRequest(
                    SSOAgentRequest.ACTION_ASSERT_SESSION,
                    jossoSessionId,
                    null,
                    null,
                    hreq,
                    hres
            );


            // TODO: Agents should be able to pass back responses corresponding to the submitted request.
            try {
                _agent.processRequest(sessionAssertionRequest);
                if (log.isDebugEnabled())
                    log.debug("asserted successfully SSO session for : " + jossoSessionId);
            } catch (FatalSSOSessionException e) {
                if (log.isDebugEnabled())
                    log.debug("error asserting SSO session : " + jossoSessionId);

                String requestedResourceUrl;

                // Clear previous COOKIE ...
                Cookie ssoCookie = _agent.newJossoCookie(hreq.getContextPath(), "-");
                hres.addCookie(ssoCookie);
                session.invalidate();
                requestedResourceUrl = _agent.buildBackToURL(hreq, "");
                hres.sendRedirect(hres.encodeRedirectURL(requestedResourceUrl));
                return ;
            }

        }

        filterChain.doFilter(hreq, hres);

    }

    public void destroy() {
        // Validate and update our current component state
        if (_agent != null) {
            _agent.stop();
            _agent = null;
        }

    }


    /**
     * Creates a new request
     */
    protected SSOAgentRequest doMakeSSOAgentRequest(int action, String sessionId, LocalSession session, String assertionId,
                                                    HttpServletRequest hreq, HttpServletResponse hres) {
        GenericServletSSOAgentRequest r = new GenericServletSSOAgentRequest(action, sessionId, session, assertionId);
        r.setRequest(hreq);
        r.setResponse(hres);

        return r;

    }


}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.