Esto es posible, pero que yo sepa no es posible sin (algunos) código. Aquí hay una solución que hace no tocar las aplicaciones web desplegadas de ninguna manera, pero que tampoco le da ninguna autorización detallada, solo autenticación.
Tomcat 7 (y 6?) Tienen una muy buena característica para realizar la autenticación a pesar de que no hay recursos protegidos en la aplicación web, llamado preemtiveAuthentication:
<Context preemptiveAuthentication="true">
<Valve className="org.apache.catalina.authenticator.BasicAuthenticator" />
</Context>
pop que en su contexto donde quiera que sea (tal vez lo que necesita para crear $CATALINA_BASE/conf/Catalina/localhost/mywebapp.xml
para proteger mywebapp. guerra).
Esto hará que cualquier solicitud entrante con algo en el encabezado Autorización desencadene la autorización. Cualquier solicitud sin, el encabezado de Autorización aún se procesará.
http://example.com:8080/mywebapp/
va a funcionar, mientras GET/
http://user:[email protected]:8080/mywebapp/
no (o, se comprobará si hay un nombre de usuario y contraseña)
El truco que queda, por tanto, es viaje que "característica" cada time, incluso para usuarios que no envían ningún encabezado de autorización. Aquí es donde tuve que volver a una válvula.
Aquí está el código de una válvula que establece un encabezado de solicitud "Autorización" para "foo" si no está presente.
import javax.servlet.ServletException;
import java.io.IOException;
import org.apache.catalina.valves.ValveBase;
import org.apache.catalina.connector.Request;
import org.apache.catalina.connector.Response;
public class ConditionallyAddFakeAuthorizationHeader extends ValveBase {
public void invoke(Request request, Response response) throws IOException, ServletException {
if (request.getCoyoteRequest().getMimeHeaders().getValue("authorization") == null) {
request.getCoyoteRequest().getMimeHeaders().addValue("authorization").setString("foo");
}
getNext().invoke(request, response);
}
}
compilar el archivo, darle un buen paquete si quieres y lo puso en la ruta de clase compartida de Tomcat, y añadir cambiar su mywebapp.xml de la siguiente manera (añadir la nueva válvula antes de la authenicator básico!):
<Context preemptiveAuthentication="true">
<Valve className="ConditionallyAddFakeAuthorizationHeader"/>
<Valve className="org.apache.catalina.authenticator.BasicAuthenticator" />
</Context>
Y voilá, su contexto será no permite ninguna solicitud a través de, a menos que esté autenticado para el dominio que usted ha definido.
Hola, tomé tu idea y la empalmé con una función oculta y todo son solo unas pocas afirmaciones. Extraño por qué esto no está incorporado en BasicAuthenticator ... – mogsie