/*
* 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.wls10.agent;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.josso.agent.SSOAgentRequest;
import org.josso.agent.http.HttpSSOAgent;
import org.josso.agent.SSOPartnerAppConfig;
import org.josso.servlet.agent.GenericServletSSOAgentRequest;
import org.josso.gateway.identity.SSORole;
import org.josso.gateway.identity.exceptions.SSOIdentityException;
import weblogic.servlet.security.ServletAuthentication;
import javax.security.auth.login.LoginException;
import javax.servlet.http.HttpServletRequest;
import java.security.Principal;
/**
* @org.apache.xbean.XBean element="agent"
* Weblogic SSO Agent implementation, it will create Weblogic security context.
*
*
* Date: Nov 27, 2007
* Time: 11:08:18 AM
*
* @author <a href="mailto:sgonzalez@josso.org">Sebastian Gonzalez Oyuela</a>
*/
public class WLSSSOAgent extends HttpSSOAgent {
private static final String JOSSO_LOGIN_URI = "/josso-wls/josso_login.jsp";
private static final String JOSSO_USER_LOGIN_URI = "/josso-wls/josso_user_login.jsp";
private static final String JOSSO_SECURITY_CHECK_URI = "/josso-wls/josso_security_check.jsp";
private static final String JOSSO_LOGOUT_URI = "/josso-wls/josso_logout.jsp";
private static final String JOSSO_AUTHENTICATION_URI = "/josso-wls/josso_authentication.jsp";
private static Log logger = LogFactory.getLog(WLSSSOAgent.class);
/**
* This method builds a login URL based on a HttpServletRequest. The url contains all necessary parameters
* required by the front-channel part of the SSO protocol.
*/
public String buildLoginUrl(HttpServletRequest hreq) {
String loginUrl = getGatewayLoginUrl();
String onErrorUrl = getGatewayLoginErrorUrl();
String backto = buildBackToURL(hreq, "/josso-wls/josso_security_check.jsp");
loginUrl = loginUrl + "?josso_back_to=" + backto;
// Add login URL parameters
loginUrl += buildLoginUrlParams(hreq);
return loginUrl;
}
/**
* By default we do require to authenticate all requests.
*/
protected boolean isAuthenticationAlwaysRequired() {
return true;
}
protected Principal authenticate(SSOAgentRequest request) {
if (logger.isDebugEnabled())
logger.debug("Authenticating SSO Agent request ... ");
try {
GenericServletSSOAgentRequest r = (GenericServletSSOAgentRequest) request;
String ssoSessionId = r.getSessionId();
int result = ServletAuthentication.login(ssoSessionId, ssoSessionId, r.getRequest(), r.getResponse());
if (logger.isDebugEnabled())
logger.debug("Authenticating SSO Agent request : " + result);
if (result == ServletAuthentication.AUTHENTICATED) {
Principal p = this.getSSOIdentityManager().findUserInSession(request.getRequester(), ssoSessionId);
if (logger.isDebugEnabled())
logger.debug("WLS Principal is " + p.getName());
return p;
}
} catch (LoginException e) {
logger.warn(e.getMessage());
if (logger.isDebugEnabled())
logger.debug(e, e);
return null;
} catch (Exception e) {
logger.error(e.getMessage());
if (logger.isDebugEnabled())
logger.debug(e, e);
return null;
}
return null;
}
@Override
public String getJossoLoginUri() {
return JOSSO_LOGIN_URI;
}
@Override
public String getJossoUserLoginUri() {
return JOSSO_USER_LOGIN_URI;
}
@Override
public String getJossoSecurityCheckUri() {
return JOSSO_SECURITY_CHECK_URI;
}
@Override
public String getJossoLogoutUri() {
return JOSSO_LOGOUT_URI;
}
@Override
public String getJossoAuthenticationUri() {
return JOSSO_AUTHENTICATION_URI;
}
/**
* Log messages to common logging infrastructrue
* @param message
*/
protected void log(String message) {
// TODO : Can we use a BEA Logger ?!
logger.info(message);
}
/**
* Log messages to common logging infrastructrue
* @param message
*/
protected void log(String message, Throwable throwable) {
logger.info(message, throwable);
}
}