2012-05-27 11 views
5

Me he quedado atrapado en este por un tiempo. Estoy intentando acceder al ContainerServlet que implementé usando HttpClient con Tomcat 7. Sigo recibiendo el mensaje de error "Restricted (ContainerServlet)". He agregado Basic Authentication e intenté configurarlo como lo hizo la aplicación Host-Manager sin suerte.Tomcat 7 Restricted (ContainerServlet) error

Mi HostManagerServlet comienza con:

public class HostManagerServlet 
extends HttpServlet implements ContainerServlet {... 

Mi web.xml contiene:

<servlet> 
      <servlet-name>virtualHostCreator</servlet-name> 
      <servlet-class>com.eatmyfish.servlets.HostManagerServlet</servlet-class> 
      </servlet> 
      <servlet-mapping> 
      <servlet-name>virtualHostCreator</servlet-name> 
      <url-pattern>/virtualhostcreator/*</url-pattern> 
      </servlet-mapping> 
    <security-constraint> 
     <web-resource-collection> 
      <web-resource-name>HostManager commands</web-resource-name> 
      <url-pattern>/virtualhostcreator/*</url-pattern> 
     </web-resource-collection> 
     <auth-constraint> 
      <!-- NOTE: This role is not present in the default users file --> 
      <role-name>admin-script</role-name> 
     </auth-constraint> 
     </security-constraint> 
     <security-constraint> 
     <web-resource-collection> 
      <web-resource-name>HTMLHostManager commands</web-resource-name> 
      <url-pattern>/virtualhostcreator/*</url-pattern> 
     </web-resource-collection> 
     <auth-constraint> 
      <!-- NOTE: This role is not present in the default users file --> 
      <role-name>admin-gui</role-name> 
     </auth-constraint> 
     </security-constraint> 
<login-config> 
    <auth-method>BASIC</auth-method> 
    </login-config> 
<security-role> 
    <description> 
     The role that is required to log in to the Host Manager Application HTML 
     interface 
    </description> 
    <role-name>admin-gui</role-name> 
    </security-role> 
    <security-role> 
    <description> 
     The role that is required to log in to the Host Manager Application text 
     interface 
    </description> 
    <role-name>admin-script</role-name> 
    </security-role> 

Mi gato-users.xml contiene:

. 
. 
. 
<role rolename="admin-gui"/> 
    <role rolename="admin-script"/> 
    <role rolename="manager-gui"/> 
    <role rolename="tomcat"/> 
    <role rolename="role1"/> 
    <user username="tomcat" password="tomcat" roles="tomcat,admin-gui,admin-script,manager-gui"/> 
. 
. 
. 

El código que hace que el HttpClient llamar (he intentado algunos enfoques diferentes):

Enfoque Uno -

String url = environment.getProperty("baseurl"); 
     url += "virtualhostcreator/createVirualHost?name="+group.getGroupName(); 
     HttpClient httpclient = new DefaultHttpClient(); 

     HttpGet httpget = new HttpGet(url); 
     httpget.addHeader(BasicScheme.authenticate(
       new UsernamePasswordCredentials("tomcat", "tomcat"), 
       "UTF-8", false)); 
     HttpResponse response = httpclient.execute(httpget); 

enfoque de dos -

String url = environment.getProperty("baseurl"); 
     url += "virtualhostcreator/createVirualHost?name="+group.getGroupName(); 
     DefaultHttpClient httpclient = new DefaultHttpClient(); 
     httpclient.getCredentialsProvider().setCredentials(
       new AuthScope("localhost", 8080), 
       new UsernamePasswordCredentials("tomcat", "tomcat")); 
     // Create AuthCache instance 
     AuthCache authCache = new BasicAuthCache(); 
     // Generate BASIC scheme object and add it to the local 
     // auth cache 
     HttpHost targetHost = new HttpHost("localhost", 8080, "http"); 
     BasicScheme basicAuth = new BasicScheme(); 
     authCache.put(targetHost, basicAuth); 

     // Add AuthCache to the execution context 
     BasicHttpContext localcontext = new BasicHttpContext(); 
     localcontext.setAttribute("http.auth.auth-cache", authCache); 

     HttpGet httpget = new HttpGet(url); 

     HttpResponse response = httpclient.execute(targetHost, httpget,localcontext); 

StackTrace del error:

SEVERE: Allocate exception for servlet virtualHostCreator 
java.lang.SecurityException: Restricted (ContainerServlet) class com.eatmyfish.servlets.HostManagerServlet 
    at org.apache.catalina.core.DefaultInstanceManager.checkAccess(DefaultInstanceManager.java:536) 
    at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:509) 
    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:124) 
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1136) 
    at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:857) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:135) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:581) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:722) 

Alguna idea de lo que estoy haciendo mal? No puedo pasar el error Restricted (ContainerServlet).

+0

Dean: cuando hace una pregunta como esta, debe incluir la pila que informa el error. Si nada más, hará que sea más fácil para otras personas con el mismo problema encontrar su pregunta/respuesta. –

+0

Edité mi pregunta para incluir el seguimiento de la pila según su solicitud. –

+0

@Dean, ¿qué escribiste en los métodos 'getWrapper()' y 'setWrapper()' – Kainix

Respuesta

15

que tenía un problema similar en Tomcat 7 y era capaz de trabajar alrededor de ella mediante la edición del elemento de nivel superior en ./conf/context.xml para parecerse

<Context privileged="true"> 

Lo que no puedo entender es cómo los servlets del administrador de Tomcat pueden cargar sin esta configuración. Alguien tiene alguna pista?

1

Encontré la respuesta. Que necesitaba para establecer privilegiada = true en el contexto de la máquina interna de server.xml