Login and set up principal in request and session. This implements
programmatic login for servlets.
Due to a number of bugs in RI the security context is not
shared between web container and ejb container. In order for an
identity established by programmatic login to be known to both
containers, it needs to be set not only in the security context but
also in the current request and, if applicable, the session object.
If a session does not exist this method does not create one.
See bugs 4646134, 4688449 and other referenced bugs for more
background.
Note also that this login does not hook up into SSO.
// Need real request object not facade
CoyoteRequest req = getUnwrappedCoyoteRequest(request);
if (req == null) {
return Boolean.valueOf(false);
}
// Try to login - this will set up security context on success
LoginContextDriver.login(user, password, realm);
// Create a WebPrincipal for tomcat and store in current request
// This will allow programmatic authorization later in this request
// to work as expected.
SecurityContext secCtx = SecurityContext.getCurrent();
assert (secCtx != null); // since login succeeded above
WebPrincipal principal = new WebPrincipal(user, password, secCtx);
req.setUserPrincipal(principal);
req.setAuthType(WEBAUTH_PROGRAMMATIC);
if(logger.isLoggable(Level.FINE)){
logger.log(Level.FINE, "Programmatic login set principal in http request to: "+
user);
}
// Try to retrieve a Session object (not the facade); if it exists
// store the principal there as well. This will allow web container
// authorization to work in subsequent requests in this session.
Session realSession = getSession(req);
if (realSession != null) {
realSession.setPrincipal((Principal)principal);
realSession.setAuthType(WEBAUTH_PROGRAMMATIC);
if(logger.isLoggable(Level.FINE)){
logger.log(Level.FINE, "Programmatic login set principal in session.");
}
} else {
if(logger.isLoggable(Level.FINE)){
logger.log(Level.FINE,"Programmatic login: No session available.");
}
}
return Boolean.valueOf(true);