«Я люблю писать код аутентификации и авторизации». Нет 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 — отличный инструмент для поддержания ваших библиотек разработки в актуальном состоянии. Чтобы установить его, запустите
|
Обратите внимание, что 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
Перейдите к файлу 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.
Как только вы введете данные подключенного пользователя Okta (вы можете использовать тот же логин, что и ваша учетная запись разработчика Okta здесь), вы должны увидеть приветственное сообщение с полным именем, которое вы ввели при регистрации:
Подсказка: выход из сеанса 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.
Создайте 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
как и раньше. Когда вы нажимаете кнопку « Приложение менеджера», введенные выше данные пользователя должны открыть экран менеджера.
Прокрутите вниз до WAR-файла, чтобы развернуть раздел. Нажмите Обзор … и выберите файл WAR из ранее. Нажмите Развернуть .
Если вы прокрутите вверх, вы увидите что-то вроде /demo-0.0.1-SNAPSHOT
указанное в разделе « Приложения ». Нажмите здесь, чтобы перейти на http://localhost:8080/demo-0.0.1-SNAPSHOT
откуда Tomcat обслуживает наше приложение. Вы увидите ошибку Bad Request.
Это связано с тем, что 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 .
Проверьте некоторые из этих ссылок ниже для получения дополнительной информации:
- i18n в Java 11, Spring Boot и JavaScript
- Spring Boot 2.1: выдающаяся поддержка OIDC, OAuth 2.0 и Reactive API
- Перенесите приложение Spring Boot на новейшую и лучшую Spring Security и OAuth 2.0
- Создавайте реактивные API с помощью Spring WebFlux
- Создайте реактивное приложение с помощью Spring Boot и MongoDB
- Baeldung Как развернуть файл WAR в Tomcat
Как то, что вы узнали сегодня? Подпишитесь на нас в Twitter и подпишитесь на наш канал на YouTube .
«Развертывание приложения Spring Boot в Tomcat» первоначально было опубликовано в блоге разработчиков Okta 16 апреля 2019 года.
«Я люблю писать код аутентификации и авторизации». Нет Java-разработчика. Надоело строить одни и те же экраны входа снова и снова? Попробуйте API Okta для размещенной аутентификации, авторизации и многофакторной аутентификации.