[jboss-jira] [JBoss JIRA] (SECURITY-728) WebJASPIOptionalAuthenticator does not actually authenticate
arjan tijms (JIRA)
jira-events at lists.jboss.org
Sat Feb 23 15:38:57 EST 2013
arjan tijms created SECURITY-728:
------------------------------------
Summary: WebJASPIOptionalAuthenticator does not actually authenticate
Key: SECURITY-728
URL: https://issues.jboss.org/browse/SECURITY-728
Project: PicketBox
Issue Type: Feature Request
Security Level: Public (Everyone can see)
Affects Versions: PIcketBox_4_0_15.Final
Reporter: arjan tijms
Assignee: Anil Saldhana
According to the JASPIC specification, a SAM should be invoked for unprotected resources as well as protected resources. Invoking the SAM for unprotected resources is required for pre-emptive authentication.
This is detailed in section 3.8 of the JSR 196 (JASPIC) specification and is explicitly acknowledged by the spec lead at http://java.net/jira/browse/SERVLET_SPEC-21
However, the documented {{WebJASPIAuthenticator}} valve is not invoked for unprotected resources. There is an undocumented valve, {{WebJASPIOptionalAuthenticator}}, which can be used, but this one does not actually authenticate.
See the following fragment:
{code}
boolean isValid = sam.isValid(messageInfo, new Subject(), messageLayer, appContext, cbh);
if (isValid) {
WebLogger.WEB_SECURITY_LOGGER.debugf("JASPI validation for unprotected request context %s succeeded", request.getServletPath());
sam.secureResponse(messageInfo, new Subject(), messageLayer, appContext, cbh);
}
{code}
As can be seen, the callbackhandler ({{cbh}}) is *not* processed.
Additionally, the javadoc comments for {{WebJASPIOptionalAuthenticator}} says calling unprotected resources is optional, but I don't think this is the case:
{code}
/**
* <p>
* This class implements a JASPI authenticator for unprotected resources. In the JASPI Servlet profile, authentication
* for unprotected resources is optional but it is still allowed. When performed, the JASPI authentication modules must
* grant access to the unprotected resources irrespective of the caller, which may be anonymous (i.e, no security info
* supplied).
* </p>
*
* @author <a href="mailto:sguilhen at redhat.com">Stefan Guilhen</a>
*/
@SuppressWarnings("unused")
public class WebJASPIOptionalAuthenticator extends ValveBase {
{code}
{{WebJASPIOptionalAuthenticator}} should probably contain the following code in the {{isValid}} if statement:
{code}
PasswordValidationCallback pvc = cbh.getPasswordValidationCallback();
CallerPrincipalCallback cpc = cbh.getCallerPrincipalCallback();
// get the client principal from the callback.
Principal clientPrincipal = cpc.getPrincipal();
if (clientPrincipal == null) {
clientPrincipal = new SimplePrincipal(cpc.getName());
}
// if the client principal is not a jboss generic principal, we need to build one before registering.
if (!(clientPrincipal instanceof JBossGenericPrincipal))
clientPrincipal = this.buildJBossPrincipal(clientSubject, clientPrincipal);
this.register(request, response, clientPrincipal, authMethod, pvc.getUsername(),
new String(pvc.getPassword()));
{code}
(code taken from {{WebJASPIAuthenticator}}).
Perhaps it's better if the two valves are merged?
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira
More information about the jboss-jira
mailing list