2011-03-01 10 views

Respuesta

7

Primero intenté (sin éxito) incluir la válvula BasicAuthenticator en conf/context.xml. Esto no pareció tener ningún efecto.

finalmente conseguí que funcione (garantizados todos los webapps) mediante la adición de este fragmento a conf/web.xml:

<security-constraint> 
    <web-resource-collection> 
     <web-resource-name>Basic Authentication</web-resource-name> 
<!--Here wildcard entry defines authentication is needed for whole app --> 
      <url-pattern>/*</url-pattern> 
     <http-method>GET</http-method> 
     <http-method>POST</http-method> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>myrole</role-name> 
    </auth-constraint> 
</security-constraint> 

<login-config> 
    <auth-method>BASIC</auth-method> 
</login-config> 

<security-role> 
    <description>My role</description> 
    <role-name>myrole</role-name> 
</security-role> 
4

dos formas vienen a la mente:

  1. Puede modificar conf/context.xml, que consigue incluida por todos aplicaciones web, e insertar las directivas de autenticación en ese país. La desventaja es que no se puede excluir una aplicación web de la autenticación hasta donde yo sé, y todas las aplicaciones comparten los mismos requisitos de función (aunque eso suene como lo que necesita)
  2. Puede implementar la seguridad a través de apache o algún otro servidor web corriendo frente a Tomcat. Esto tiene sentido especialmente si ya tiene uno.
2

Se puede hacer, pero tendrá que trabajar en ello.

Para Tomcat, básicamente lo que quiere es un Tomcat Valve. Es como un filtro de servlet, pero es específico de Tomcat.

se puede colocar una válvula en la entrada de host del servidor de configuración, a continuación, todas las aplicaciones dentro de ese anfitrión tendrá que pasar por eso de la válvula. Y esa válvula es lo que necesita para manejar su autenticación BASIC.

Tomcat DOES ya tiene una Válvula de Autenticación Básica, pero está diseñada para funcionar con la aplicación web. Probablemente pueda agarrar la fuente a esto y hackearlo para trabajar en el nivel de Host en lugar de a nivel de la Aplicación Web, protegiendo así todas sus aplicaciones sin configurarlas individualmente.

Ahora, si tuviera un poco más de mente abierta, sugeriría Tomcat Single Sign On, y luego aumentaría cada una de las aplicaciones web para usar BASIC en su web.xml siguiendo las especificaciones del servlet. Es un cambio básicamente trivial en las aplicaciones web.xml, pero también resuelve el problema para usted. Pero dijiste que no querías modificar las aplicaciones web, así que te quedaste atrapado usando cosas específicas de Tomcat, y tú mismo las "elaboraste a mano".

+0

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

1

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.

Cuestiones relacionadas