2011-10-11 8 views
8

Ho accesso al gestore tomcat e posso caricare file di guerra. Una di queste guerre è un progetto web statico (file html + media zippato, rinominato in * .war). Voglio aggiungere un file Web-INF/web.xml a questa guerra per proteggere il contenuto con l'autenticazione http di base.Come si fornisce l'autenticazione HTTP di base per le webapp statiche di tomcat senza cambiare tomcat-users.xml?

So come farlo aggiungendo utenti globali e assegnando ruoli nello tomcat-users.xml, ma voglio che tutti i nomi utente e le password siano definiti nel mio file di guerra.

  1. Questo può essere fatto senza toccare il telefono tomcat-users.xml del tomcat?
  2. E se sì, come posso specificarlo nel mio progetto statico web.xml?

Thx, la Juve

risposta

8

ho trovato una soluzione qui: http://wiki.metawerx.net/wiki/SecuringYourSiteWithContainerManagedSecurity

La pagina si descrivono come definire il proprio META-INF/context.xml che punta al proprio WEB-INF/users.xml. Sfortunatamente, il collegamento al file users.xml deve essere assoluto e non voglio fare ipotesi sul percorso del sistema operativo/file system nei miei file di configurazione.

Ecco il mio attuale 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> 

Una corrispondenza META-INF/context.xml sarebbe simile a questa:

<?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

Se si conosce la directory in cui Tomcat mette tutte le applicazioni distribuite che è possibile utilizzare percorsi relativi (perché sono risolti in relazione a catalina.base env.variable, cioè tomcat home).

Per esempio, se si sta distribuendo usando IDE Eclipse, di solito le applicazioni vengono distribuiti in wtpwebapps, in modo da poter utilizzare:

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

Non ancora perfetto, ma almeno non si sta utilizzando percorsi completi.

Un'alternativa, sarebbe quella di implementare il proprio Reame che estende MemoryRealm e pre-elabora il percorso prima di chiamare super.setPathname();

Si può anche andare per un DataSourceRealm, che non ha questo problema ed è adatto per la produzione.

Per l'approccio indipendente del contenitore servlet è possibile utilizzare un framework di sicurezza basato su filtri (ad es. Sicurezza Spring, ...)

Problemi correlati