Ich bin dabei, zwei Servlets zu einem eingebetteten Tomcat hinzuzufügen. In diesem Szenario sollte eines der Servlets durch die Standardauthentifizierung "geschützt" werden. Ich möchte die Sicherheitsbeschränkungen nur über Code hinzufügen. In Bezug auf diese Link sollte es nicht zu schwer sein.Eingebetteter Tomcat mit einfacher Authentifizierung über Code
Ich baue ein Testszenario:
Projekt: EmbeddedTomcatTest
-Source Packages
--tomcat.test
---ServletOne.java
---ServletTwo.java
---StartEmbeddedTomcat.java (contains main method)
-Test Packages
-Other Sources
--src/main/resources
---Tomcat-users.xml
-Project Files
--pom.xml
Die Abhängigkeiten meiner pom wie folgt aussieht:
<dependencies>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>8.5.4</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
</dependencies>
Bisher habe ich ein eingebettetes Kater mit zwei Servlets hinzugefügt, sind über verschiedene URL-Muster zugänglich, was gut funktioniert.
public class StartEmbeddedTomcat {
private static final String AUTH_ROLE = "test";
public static void main(String[] args) throws LifecycleException {
Tomcat tomcat = new Tomcat();
tomcat.setPort(8080);
// adding a context
Context ctx = tomcat.addContext("/", new File(".").getAbsolutePath());
// Login Config
LoginConfig config = new LoginConfig();
config.setAuthMethod("BASIC");
// adding constraint with role "test"
SecurityConstraint constraint = new SecurityConstraint();
constraint.addAuthRole(AUTH_ROLE);
// add constraint to a collection with pattern /second
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/second");
constraint.addCollection(collection);
ctx.setLoginConfig(config);
// does the context need a auth role too?
ctx.addSecurityRole(AUTH_ROLE);
ctx.addConstraint(constraint);
// add servlet with pattenr /first and /second
Tomcat.addServlet(ctx, "one", new ServletOne());
ctx.addServletMapping("/first", "one");
Tomcat.addServlet(ctx, "two", new ServletTwo());
ctx.addServletMapping("/second", "two");
// add tomcat users to realm
String path = "tomcat-users.xml";
URL uri = ServletOne.class.getClassLoader().getResource(path);
MemoryRealm realm = new MemoryRealm();
realm.setPathname(uri.toString());
tomcat.getEngine().setRealm(realm);
tomcat.start();
tomcat.getServer().await();
}
}
Die tomcat-users.xml
ist nicht besonders.
<tomcat-users>
<role rolename="manager-gui"/>
<role rolename="test"/>
<user name="admin" password="" roles="manager-gui"/>
<user name="test" password="test" roles="test"/>
</tomcat-users>
Ich denke, der Code der Servlets nicht wichtig ist, da sie nur "Im Servlet-one" oder "Im Servlet zwei" -Antwort.
Meiner Meinung nach sollte die ganze Anwendung oder zumindest jede Anfrage auf /second
geschützt werden. Was habe ich falsch gemacht? Gibt es noch etwas, was ich tun muss?
---- bearbeiten ---
Heute fand ich diese question von Stack-Überlauf. Ich habe noauthCTX.setAltDDName("Path\\to\\web.xml");
zu meinem Testszenario hinzugefügt. Die web.xml wie folgt aussieht:
<web-app>
<display-name>Test Service</display-name>
<servlet>
<servlet-name>ServletOne</servlet-name>
<servlet-class>tomcat.test.test.ServletOne</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ServletOne</servlet-name>
<url-pattern>/servletOne/*</url-pattern>
</servlet-mapping>
</web-app>
Ich dachte, mein Servlet würde man über localhost:8080/servletOne/*
auch zugänglich sein. Es ist nicht .. eigentlich bin ich sehr verwirrt. Ich hoffe jemand kann mir helfen ..