Статьи

Разверните загрузочное приложение Spring в Tomcat

«Я люблю писать код аутентификации и авторизации». Нет Java-разработчика. Надоело строить одни и те же экраны входа снова и снова? Попробуйте API Okta для размещенной аутентификации, авторизации и многофакторной аутентификации.

Развертывание приложений сложно. Часто вам нужен консольный доступ к серверу, с которого вы извлекаете последний код и затем вручную создаете экземпляр в своем контейнере. В этом руководстве вы увидите более простой способ использования Tomcat: вы создадите аутентифицированное веб-приложение и развернете его через браузер, используя последние версии Tomcat, Spring Boot и Java.

Начиная с версии 9, Oracle сократила частоту выпусков Java до шести месяцев, поэтому номера основных версий растут гораздо быстрее, чем раньше. Последним выпуском является Java SE 11 (Standard Edition), вышедшая в сентябре 2018 года. Самое большое изменение лицензий в этом новом выпуске привело к однозначному выводу: использовать OpenJDK с этого момента. Open JDK — это бесплатная версия Java, которую вы также можете получить от Oracle. Кроме того, Java 11 имеет долгосрочную поддержку, поэтому эту версию вы должны использовать для новых проектов в будущем.

Запустите приложение Java 11

Откройте консоль и запустите java -version чтобы увидеть, какую версию Java вы используете.

[karl@localhost demo]$ java -version
openjdk version "1.8.0_111"
OpenJDK Runtime Environment (build 1.8.0_111-b16)
OpenJDK 64-Bit Server VM (build 25.111-b16, mixed mode)
[karl@localhost demo]$

Java 8 показана как версия 1.8.0 .

SDKMAN — отличный инструмент для поддержания ваших библиотек разработки в актуальном состоянии. Чтобы установить его, запустите

$ curl -s "https://get.sdkman.io" | bash

Обратите внимание, что SDKMAN работает только в Linux и Unix-подобных системах. Пользователи Windows должны будут установить последнюю версию Java вручную .

Если SDKMAN установлен правильно, вы увидите инструкции по получению команды для работы в вашем текущем терминале.

All done!
 
Please open a new terminal, or run the following in the existing one:
 
    source "/home/karl/.sdkman/bin/sdkman-init.sh"
 
Then issue the following command:
 
    sdk help
 
Enjoy!!!
[karl@localhost demo]

Запустите указанную source команду, и команда sdk должна быть активной.

Теперь установите последнюю sdk install java Java просто с sdk install java .

[karl@localhost demo]$ sdk install java
 
Downloading: java 11.0.2-open
 
In progress...

После того, как java -version 11.0.2 должно 11.0.2 .

Done installing!
 
Setting java 11.0.2-open as default.
[karl@localhost demo]$ java -version
openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)
[karl@localhost demo]$

ПРИМЕЧАНИЕ: если у вас уже есть SDKMAN! и Java 11 установлена, вы можете установить ее по умолчанию, используя sdk default java 11.0.2-open .

Создайте проект Spring Boot для Tomcat

Самый популярный способ начать проект Spring с Spring Initializr

Приложение Spring Boot

Перейдите к файлу start.spring.io в своем любимом веб-браузере, затем выберите параметры проекта:

  • Оставьте как Maven, Java и последнюю стабильную версию Spring Boot (2.1.4)
  • Измените группу и артефакт, если хотите
  • Нажмите на Дополнительные параметры и выберите Java 11
  • В поле Зависимости введите и выберите Web , Security и Devtools . Они должны отображаться как зависимости, выбранные справа

Теперь нажмите Generate Project, и zip-файл будет загружен вместе с проектом внутри. Просто разархивируйте и введите каталог из командной строки. Если вы увидите ls вы увидите пять файлов и один каталог ( src ).

[karl@m14x demo]$ ls
HELP.md  mvnw  mvnw.cmd  pom.xml  src

mvnw — это скрипт, который позволяет вам использовать Maven, не устанавливая его глобально. mvnw.cmd — версия этого скрипта для Windows. pom.xml описывает ваш проект, а src содержит ваш Java-код внутри. (Обратите внимание, что есть также скрытый каталог .mvn котором .mvn встроенные файлы maven!)

Давайте посмотрим, что делает проект. Введите ./mvnw spring-boot:run и нажмите ввод. Все может занять некоторое время для установки, но в конечном итоге вы должны увидеть что-то вроде этого:

Tomcat started on port(s): 8080 (http) with context path ''
2019-03-17 19:56:49.342  INFO 10744 --- [  restartedMain] com.karl.demo.DemoApplication         : Started DemoApplication in 3.022 seconds (JVM running for 3.56)

Обратите внимание на сообщение Tomcat started on port(s): 8080 . Откройте окно браузера по http://localhost:8080 и вы должны увидеть страницу входа.

Вы можете аутентифицироваться, используя «user» для имени пользователя и пароля, который был напечатан на вашем терминале. После входа в систему вы увидите страницу с ошибкой 404, потому что вы не создали никакого кода для отображения целевой страницы в / .

Добавьте безопасную аутентификацию в приложение Spring Boot

Давайте добавим аутентификацию с Okta. Почему окта? Потому что вы не хотите беспокоиться об управлении своими пользователями и хэшировании их паролей, не так ли? Друзья не позволяют друзьям писать аутентификацию — пусть эксперты сделают это за вас! В конце концов, API Okta также построен на Java и Spring Boot!

После того, как вы зарегистрировали бесплатную учетную запись, перейдите в раздел Приложения на панели инструментов. Нажмите « Добавить приложение» , выберите « Интернет» и нажмите « Далее» .

Теперь вы должны быть на странице настроек приложения. Замените поле URI для перенаправления входа следующим:

http://localhost:8080/login/oauth2/code/okta

Нажмите Готово внизу. Скопируйте свой идентификатор клиента и секрет клиента из раздела «Учетные данные клиента» и храните их в безопасном месте. Теперь прямо вверху щелкните вкладку API (рядом с Приложениями ) и затем Серверы авторизации . Запишите URI эмитента, который выглядит следующим образом:

https://{yourOktaDomain}/oauth2/default

Создайте файл в своем проекте в src/main/resources/application.yml и поместите эти значения внутрь:

okta: 
  oauth2:
    issuer: https://{yourOktaDomain}/oauth2/default 
    client-id: {clientId}
    client-secret: {clientSecret}

Теперь добавьте библиотеку Okta Spring Boot Starter в качестве зависимости в вашем pom.xml .

<dependency>
    <groupId>com.okta.spring</groupId>
    <artifactId>okta-spring-boot-starter</artifactId>
    <version>1.1.0</version>
</dependency>

Теперь отредактируйте ваш основной файл ввода Java — который, вероятно, находится где-то вроде src/main/java/com/example/demo/DemoApplication.java — и добавьте аннотацию @RestController к классу, а также точку входа на домашней странице:

package com.example.demo;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.security.core.Authentication;
import org.springframework.security.oauth2.core.oidc.user.DefaultOidcUser;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
@SpringBootApplication
public class DemoApplication {
 
    public static void main(String[] args) {
     SpringApplication.run(DemoApplication.class, args);
    }
 
    @GetMapping
    @ResponseBody
    public String currentUserName(Authentication authentication) {
        DefaultOidcUser userDetails = (DefaultOidcUser) authentication.getPrincipal();
        return "Hello, " + userDetails.getFullName();
    }
}

Перезапустите приложение, используя ./mvnw spring-boot:run или используйте свою IDE для его запуска.

Теперь, когда вы посещаете http://localhost:8080 вы должны увидеть экран входа Okta.

Приложение Spring Boot

Как только вы введете данные подключенного пользователя Okta (вы можете использовать тот же логин, что и ваша учетная запись разработчика Okta здесь), вы должны увидеть приветственное сообщение с полным именем, которое вы ввели при регистрации:

Приложение Spring Boot

Подсказка: выход из сеанса OAuth2 более нюансов, чем можно себе представить. Чтобы продолжить тестирование процесса входа в систему, я рекомендую использовать закрытые окна просмотра, чтобы обеспечить возврат экрана входа в систему; закройте их, когда вы закончите.

Остановите приложение Spring Boot, чтобы вы могли запустить Tomcat на порте по умолчанию 8080.

Настройте Tomcat 9 для приложения Spring Boot

Запуск Tomcat и запуск не может быть проще. Начните с загрузки двоичного файла, совместимого с вашей платформой. Убедитесь, что вы используете файл .zip или .tar.gz а не установщик. Извлеките его в папку и в каталоге bin запустите сценарий запуска — startup.sh для Linux / Mac и startup.bat для Windows.

[karl@m14x bin]$ ./startup.sh
Using CATALINA_BASE:   /home/karl/Downloads/apache-tomcat-9.0.19
Using CATALINA_HOME:   /home/karl/Downloads/apache-tomcat-9.0.19
Using CATALINA_TMPDIR: /home/karl/Downloads/apache-tomcat-9.0.19/temp
Using JRE_HOME:     /home/karl/.sdkman/candidates/java/current
Using CLASSPATH:    /home/karl/Downloads/apache-tomcat-9.0.19/bin/bootstrap.jar:/home/karl/Downloads/apache-tomcat-9.0.19/bin/tomcat-juli.jar
Tomcat started.
[karl@m14x bin]$

Подсказка: вы также можете использовать ./catalina.sh run для запуска вашего приложения. Эта команда напечатает логи на ваш терминал, поэтому вам не нужно следить за ними, чтобы увидеть, что происходит.

Перейдите по http://localhost:8080 и вы должны увидеть страницу установки Tomcat.

Приложение Spring Boot

Создайте WAR-файл из вашего проекта Spring Boot

Теперь вам нужно создать WAR-файл из вашего приложения Spring Boot. Добавьте следующее сразу после узла <description> в вашем pom.xml .

<packaging>war</packaging>

Удалите встроенный сервер Tomcat, добавив в список зависимостей следующее:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-tomcat</artifactId>
   <scope>provided</scope>
</dependency>

Наконец, включите ваше приложение в качестве сервлета, расширив основной класс с помощью SpringBootServletInitializer :

import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
 
@SpringBootApplication
public class DemoApplication extends SpringBootServletInitializer {
    ...
}

Теперь очистите и упакуйте свое приложение с помощью следующей команды:

./mvnw clean package

Вы должны увидеть сообщение, подобное следующему:

[INFO] Building war: /home/karl/tst/demo/target/demo-0.0.1-SNAPSHOT.war

Обратите внимание, где живет ваш новый .war .

Разверните WAR для Tomcat из браузера

Возможно, вы заметили, что с правой стороны экрана приветствия Tomcat было три кнопки: Состояние сервера , Приложение менеджера и Диспетчер хостов . Вы можете развернуть WAR-файл из приложения Manager, но для этого требуется аутентификация (и по умолчанию пользователи не определены).

Добавьте следующее в файл conf/tomcat-users.xml в каталоге Tomcat:

<user username="karl" password="secret" roles="manager-gui" />

Вам нужно будет перезапустить Tomcat, чтобы изменения вступили в силу. Поскольку вы начали это напрямую, вам нужно остановить процесс самостоятельно. Найдите идентификатор процесса с помощью ps aux | grep tomcat ps aux | grep tomcat .

[karl@m14x bin]$ ps aux | grep tomcat
karl    11813  180  1.9 7389172 159596 pts/0  Sl   09:44   0:07 /home/karl/.sdkman/candidates/java/current/bin/java -Djava.util.logging.config.file=/home/karl/Downloads/apache-tomcat-9.0.19/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /home/karl/Downloads/apache-tomcat-9.0.19/bin/bootstrap.jar:/home/karl/Downloads/apache-tomcat-9.0.19/bin/tomcat-juli.jar -Dcatalina.base=/home/karl/Downloads/apache-tomcat-9.0.19 -Dcatalina.home=/home/karl/Downloads/apache-tomcat-9.0.19 -Djava.io.tmpdir=/home/karl/Downloads/apache-tomcat-9.0.19/temp org.apache.catalina.startup.Bootstrap start
karl    11881  0.0  0.0   6268  2280 pts/0  S+   09:44   0:00 grep tomcat
[karl@m14x bin]$

Здесь мой идентификатор процесса — 11813. Используйте команду kill, чтобы убить его.

kill 11813

Перезагрузите сервер, используя startup.sh как и раньше. Когда вы нажимаете кнопку « Приложение менеджера», введенные выше данные пользователя должны открыть экран менеджера.

Приложение Spring Boot

Прокрутите вниз до WAR-файла, чтобы развернуть раздел. Нажмите Обзор … и выберите файл WAR из ранее. Нажмите Развернуть .

Если вы прокрутите вверх, вы увидите что-то вроде /demo-0.0.1-SNAPSHOT указанное в разделе « Приложения ». Нажмите здесь, чтобы перейти на http://localhost:8080/demo-0.0.1-SNAPSHOT откуда Tomcat обслуживает наше приложение. Вы увидите ошибку Bad Request.

Приложение Spring Boot

Это связано с тем, что URL-адрес перенаправления теперь неверен в нашей конфигурации приложения Okta — все должно начинаться с demo-0.0.1-SNAPSHOT . Это имя немного громоздко. Чтобы изменить его, переименуйте ваш WAR-файл в demo.war (вы можете сделать это навсегда, добавив <finalName>demo</finalName> в раздел сборки вашего pom.xml ). Теперь нажмите Undeploy рядом с именем вашего приложения в окне менеджера и повторно разверните WAR. Теперь приложение должно быть в /demo .

Теперь в настройках приложения Okta добавьте все URL-адреса с помощью /demo , например, http://localhost:8080/demo/login/oauth2/code/okta (вы делаете это, нажимая Edit, а затем Save ). Теперь, нажав на ваше /demo приложение в менеджере (или перейдя по http://localhost:8080/demo ), вы увидите экран приветствия, как и раньше.

Совет: чтобы убедиться, что ваши локальные настройки разработки соответствуют машине, на которой вы развертываете, убедитесь, что встроенная версия Tomcat совпадает с вашим внешним сервером, добавив следующее в ваш pom.xml :

<properties>
    <tomcat.version>9.0.19</tomcat.version>
</properties>

Узнайте больше о Tomcat, Spring Boot и Java 11

Отлично, вы удаленно развернули приложение Spring Boot 2.1 в Tomcat 9, все с поддержкой Java 11!

Надеюсь, вы нашли этот урок полезным. Вы можете найти репозиторий GitHub для этого примера в oktadeveloper / okta-spring-boot-tomcat-example .

Проверьте некоторые из этих ссылок ниже для получения дополнительной информации:

Как то, что вы узнали сегодня? Подпишитесь на нас в Twitter и подпишитесь на наш канал на YouTube .

«Развертывание приложения Spring Boot в Tomcat» первоначально было опубликовано в блоге разработчиков Okta 16 апреля 2019 года.

«Я люблю писать код аутентификации и авторизации». Нет Java-разработчика. Надоело строить одни и те же экраны входа снова и снова? Попробуйте API Okta для размещенной аутентификации, авторизации и многофакторной аутентификации.