2011-10-11 7 views
8

Tengo acceso al administrador de tomcat y puedo cargar war-files. Una de estas guerras es un proyecto web estático (archivos html + multimedia comprimidos, renombrados a * .war). Deseo agregar un archivo Web-INF/web.xml a esta guerra para proteger el contenido con HTTP auth básico.¿Cómo proporciono la autenticación http básica para aplicaciones de webap estáticas de tomcat sin cambiar tomcat-users.xml?

Sé cómo hacer esto agregando usuarios globales y asignando roles en el tomcat-users.xml, pero quiero tener todos los nombres de usuario y contraseñas definidos en mi archivo war.

  1. ¿Se puede hacer esto sin tocar el tomcat's tomcat-users.xml?
  2. Y en caso afirmativo, ¿cómo especifico esto en el proyecto estático web.xml?

Thx, la Juve

Respuesta

8

he encontrado una solución a este problema: http://wiki.metawerx.net/wiki/SecuringYourSiteWithContainerManagedSecurity

La página se describe cómo definir su propio META-INF/context.xml apuntando a su propia WEB-INF/users.xml. Desafortunadamente, el enlace al archivo users.xml tiene que ser absoluto, y no quiero hacer ninguna suposición sobre las rutas de OS/filesystem en mis archivos de configuración.

Aquí está mi actual WEB-INF/web.xml:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<web-app 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd" 
    version="2.5"> 

    <display-name>SuperCoolTool</display-name> 
    <description>What an awesome app!</description> 

    <security-role> 
     <role-name>manager</role-name> 
    </security-role> 
    <security-role> 
     <role-name>keyuser</role-name> 
    </security-role> 

    <security-constraint> 
     <web-resource-collection> 
      <web-resource-name> 
       Entire Application 
      </web-resource-name> 
      <url-pattern>/*</url-pattern> 
     </web-resource-collection> 
     <auth-constraint> 
      <role-name>keyuser</role-name> 
      <role-name>manager</role-name> 
     </auth-constraint> 
    </security-constraint> 

    <login-config> 
     <auth-method>BASIC</auth-method> 
     <realm-name>Evaluation Area</realm-name> 
    </login-config> 

</web-app> 

Un juego META-INF/context.xml se vería así:

<?xml version="1.0" encoding="UTF-8"?> 
<Context> 
    <Realm className="org.apache.catalina.realm.MemoryRealm" 
      pathname="[PATH-TO-YOUR-WEBAPP]/WEB-INF/users.xml"/> 
</Context> 
1

Si conoce el directorio en el que Tomcat pone todas las aplicaciones desplegadas se pueden utilizar rutas relativas (porque se resuelven en relación con catalina.base env.variable, es decir, tomcat home).

Por ejemplo, si va a implementar utilizando el IDE Eclipse, por lo general aplicaciones se despliegan en wtpwebapps, por lo que puede utilizar:

<Realm className="org.apache.catalina.realm.MemoryRealm" 
pathname="wtpwebapps/YOUR_APP_NAME/WEB-INF/users.xml"/> 

No es perfecto todavía, pero al menos no está utilizando rutas completas.

Una alternativa sería implementar su propio Reino que amplíe MemoryRealm y preproceses la ruta de acceso antes de llamar a super.setPathname();

También puede optar por un DataSourceRealm, que no tiene este problema y es adecuado para la producción.

Para el enfoque independiente del contenedor de servlets, puede utilizar un marco de seguridad basado en filtros (por ejemplo, seguridad de primavera, ...)

Cuestiones relacionadas