* JBoss, Home of Professional Open Source.
* Copyright 2014 Red Hat, Inc., and individual contributors
* as indicated by the @author tags.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
The implementation of this interface are assumed to be stateless, if there is a need to share state between the authenticate and handleComplete calls then it should be held in the HttpServerExchange.
As an in-bound request is received the authenticate method is called on each mechanism in turn until one of the following occurs: - - A mechanism successfully authenticates the incoming request. - A mechanism attempts but fails to authenticate the request. - The list of mechanisms is exhausted.
This means that if the authenticate method is called on a mechanism it should assume it is required to check if it can actually authenticate the incoming request, anything that would prevent it from performing the check would have already stopped the authenticate method from being called.
Authentication is allowed to proceed if either authentication was required AND one handler authenticated the request or it is allowed to proceed if it is not required AND no handler failed to authenticate the request.
The handleComplete methods are used as the request processing is returning up the chain, primarily these are used to challenge the client to authenticate but where supported by the mechanism they could also be used to send mechanism specific updates back with a request.
If a mechanism successfully authenticated the incoming request then only the handleComplete method on that mechanism is called.
If any mechanism failed or if authentication was required and no mechanism succeeded in authenticating the request then handleComplete will be called for all mechanisms.
Finally if authentication was not required handleComplete will not be called for any of the mechanisms.
The mechanisms will need to double check why handleComplete is being called, if the request was authenticated then they should do nothing unless the mechanism has intermediate state to send back. If the request was not authenticated then a challenge should be sent.
The individual mechanisms should update the response headers and body of the message as appropriate however they should
not set the response code, instead that should be indicated in the
and the most appropriate
overall response code will be selected.
securityContextThe security context
indicating if a challenge was sent and the desired response code.
ChallengeResult sendChallenge(final HttpServerExchange exchange, final SecurityContext securityContext);
Where multiple mechanisms are in use concurrently all of the requested response codes will be checked and the most suitable one selected. If no specific response code is required any value less than 0 can be set.
Some mechanisms do not send a challenge and just rely on the correct information to authenticate a user being available in the request, in that case it would be normal for the mechanism to set this to false.