Статьи

Jetty-maven-plugin: запуск веб-приложения с источником данных и безопасностью

В этой статье описывается, как настроить плагин jetty-maven-plugin и контейнер сервлетов Jetty для запуска веб-приложения, использующего источник данных и требующего входа пользователей, что является основными требованиями большинства веб-приложений. Я использую Jetty в разработке, потому что с ней быстро и легко работать.

Почему пристань?

Ну, потому что он намного быстрее, чем обычно используемый нами Websphere AS, и он действительно хорошо поддерживает быструю (или, скажем так, гибкую :-)) разработку благодаря быстрому изменению. И потому что это просто круто печатать

bash$ svn checkout http://example.com/repo/trunk/mywebapp
bash$ cd mywebapp
bash$ mvn jetty:run
bash$ firefox http://localhost:8080/mywebapp

и иметь возможность немедленно войти в систему и взаимодействовать с приложением.

Однако следует отметить, что Jetty не является полнофункциональным сервером JavaEE и, следовательно, не всегда может использоваться.

Настройка проекта

Общая конфигурация

Вам нужно добавить плагин Jetty в ваш pom.xml :

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example</groupId>
  <artifactId>mywebapp</artifactId>
  <packaging>war</packaging>
  ...
  <build>
  	...
  	<plugins>
    <plugin>
      <groupId>org.mortbay.jetty</groupId>
      <artifactId>maven-jetty-plugin</artifactId>
      <version>6.1.0</version>
      <configuration>
        <scanIntervalSeconds>3</scanIntervalSeconds>
          ...
      </configuration>
      ...
    </plugin>
    ...
  </plugins>

  </build>
</project>

Как видите, я использую Jetty 6.1.0.

Определение источника данных

Предположим, что приложение использует источник данных, настроенный на сервере, и получает к нему обычный доступ через JNDI. Затем мы должны определить ссылку на источник данных в src / main / webapp / WEB-INF / web.xml :

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
	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_4.xsd">
	...
	<servlet>...</servlet>
	...
	<resource-ref>
		<res-ref-name>jdbc/LMSDB</res-ref-name>
		<res-type>javax.sql.DataSource</res-type>
		<res-auth>Container</res-auth>
		<res-sharing-scope>Shareable</res-sharing-scope>
	</resource-ref>
</web-app>

Далее нам нужно описать источник данных для Jetty. Есть несколько способов сделать это, я решил сделать это в src / main / webapp / WEB-INF / jetty-env.xml :

<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
<Configure class="org.mortbay.jetty.webapp.WebAppContext">
  <New id="LMSDB" class="org.mortbay.jetty.plus.naming.Resource">
    <Arg>jdbc/LMSDB</Arg>
    <Arg>
    	<New class="com.ibm.db2.jcc.DB2SimpleDataSource">
                 <Set name="DatabaseName">LMSDB</Set>
                 <Set name="User">myUser</Set>
                 <Set name="Password">secret</Set>
                 <Set name="ServerName">db.toronto.ca.ibm.com</Set>
                 <Set name="PortNumber">3711</Set>
     </New>
    </Arg>
  </New>
</Configure>

Обратите внимание, что используется класс DB2SimpleDataSource, а не драйвер JDBC. Это, конечно, потому что нам нужен источник данных, а не драйвер. Вики-страницы Jetty также содержат примеры конфигурации источника данных для других БД .

Наконец, мы должны сделать соответствующую реализацию JDBC доступной для Jetty, добавив ее к зависимостям плагина в pom.xml :

<plugin>
  <groupId>org.mortbay.jetty</groupId>
  <artifactId>maven-jetty-plugin</artifactId>
  <version>6.1.0</version>

  <configuration>
	<...
  </configuration>

  <dependencies>
	<dependency>
		<groupId>com.ibm.db2</groupId>
		<artifactId>db2jcc</artifactId>
		<version>9.7</version>
		<type>jar</type>
		<scope>system</scope>
		<systemPath>${basedir}/../lms.sharedlibraries/db2/db2jcc.jar</systemPath>
	</dependency>
	<dependency>
		<groupId>com.ibm.db2</groupId>
		<artifactId>db2jcc_license_cisuz</artifactId>
		<version>9.7</version>
		<type>jar</type>
		<scope>system</scope>
		<systemPath>${basedir}/../lms.sharedlibraries/db2/db2jcc_license_cisuz.jar</systemPath>
	</dependency>
  </dependencies>
</plugin>

Пожалуйста, не пренебрегайте мной за использование системных зависимостей ;-), иногда это, к сожалению, самый выполнимый способ.

Включение безопасности и настройка механизма аутентификации

Мы хотели бы ограничить доступ к приложению только для аутентифицированных пользователей в роли ADMIN, за исключением страниц в public /. Поэтому мы объявляем соответствующие ограничения безопасности в web.xml:

...
<security-constraint>
	<display-name>authorizedUsers</display-name>
	<web-resource-collection>
		<web-resource-name>ALL URLs</web-resource-name>
		<url-pattern>/*</url-pattern>
	</web-resource-collection>
	<auth-constraint>
		<role-name>ADMIN</role-name>
	</auth-constraint>
	<!--user-data-constraint>
		<transport-guarantee>CONFIDENTIAL</transport-guarantee>
	</user-data-constraint-->
</security-constraint>

<security-constraint>
	<display-name>publicAccess</display-name>
	<web-resource-collection>
		<web-resource-name>Public pages</web-resource-name>
		<url-pattern>/public/*</url-pattern>
	</web-resource-collection>
</security-constraint>

<login-config>
	<auth-method>BASIC</auth-method>
	<realm-name>Learning@IBM Mini Person Feed Management</realm-name>
</login-config>

<security-role>
	<description>administrator access</description>
	<role-name>ADMIN</role-name>
</security-role>
...

Помните, что Jetty не поддерживает HTTPS «из коробки» и, таким образом, если вы добавите ограничение данных КОНФИДЕНЦИАЛЬНО к любому ресурсу, вы автоматически получите HTTP 403 ЗАПРЕЩЕНО, независимо от того, что вы делаете. Вот почему я прокомментировал это выше. Возможно включить SSL в Jetty, но я не хотел беспокоиться о генерации сертификатов и т. Д.

Далее нам нужно рассказать Jetty, как аутентифицировать пользователей. Это делается через области, и мы будем использовать самую простую, основанную на файлах. Опять же, есть несколько способов его настройки, например, в pom.xml :

 

<plugin>
  <groupId>org.mortbay.jetty</groupId>
  <artifactId>maven-jetty-plugin</artifactId>
  <version>6.1.0</version>

  <configuration>
	<scanIntervalSeconds>3</scanIntervalSeconds>
	  <userRealms>
		<userRealm implementation="org.mortbay.jetty.security.HashUserRealm">
		  <name>Learning@IBM Mini Person Feed Management</name>
		  <config>src/test/resources/jetty-users.properties</config>
		</userRealm>
	  </userRealms>
  </configuration>

  <dependencies>...</dependencies>
</plugin>

Имя должно точно соответствовать имени области в web.xml. Затем вы определяете пользователей, их пароли и роли в объявленном файле, в этом случае в src / test / resources / jetty-users.properties :

user=psw,ADMIN

Формат файла: имя пользователя = пароль [, роль1, роль2, …].

Когда вы загрузите Jetty, вы найдете прекрасный пример использования JAAS с файловым сервером для аутентификации и авторизации в examples / test-jaas-webapp (вызовите mvn jetty: запустите из папки и перейдите по адресу http: // локальный: 8080 / причал-тест-JAAS /). Однако кажется, что JAAS вызывает дополнительные издержки, видимые как задержка в несколько секунд при запуске сервера, поэтому было бы предпочтительнее не использовать его.

Вывод

С Jetty легко включить защиту и создать источник данных, которые являются основными требованиями большинства веб-приложений. Тогда любой может очень легко запустить приложение, чтобы протестировать и разработать его. Разработка — это то, где Jetty действительно сияет при условии, что вам не нужны никакие функции, которых у нее нет.

При устранении неполадок вы можете указать Jetty регистрироваться на уровне отладки с помощью mvn -DDEBUG .. или регистрировать запросы , которые также можно настроить в файле jetty-env.xml.

Помните, что этот пост описывает конфигурацию для Jetty 6.1.0. Он может быть другим в других версиях и, конечно, другим в Jetty 7.

От http://theholyjava.wordpress.com/2010/09/10/jetty-maven-plugin-running-a-webapp-with-a-datasource-and-security/