В этом посте вы рассмотрите различные варианты реализации функции входа в систему с использованием Spring Boot 2.1. Вы начнете с самой простой, базовой аутентификации, которую вы, скорее всего, никогда не захотите использовать, за исключением, возможно, внутреннего бэкэнд-инструмента, и перейдете к простой странице аутентификации на основе форм. Затем вы настроите автоматически созданную форму по умолчанию, переопределив некоторые шаблоны и контроллеры по умолчанию. Наконец, вы перейдете к добавлению единого входа с использованием OAuth 2.0. Вы увидите, как разрешить пользователю входить в систему с помощью Github и Okta .
Предположения для этого урока довольно просты. Я предполагаю, что вы хорошо знакомы с Spring и Spring Boot, но не обязательно обладаете глубоким пониманием безопасности Spring или различных функций безопасности Spring. Вы захотите установить git
и gradle
было бы неплохо, но вы можете использовать оболочку Gradle для всех команд gradle
, так что это не является строго необходимым.
Идите вперед и клонируйте хранилище Я создал для этого учебника:
git clone https://github.com/oktadeveloper/okta-spring-boot-login-options-example.git
Этот репозиторий содержит пять подкаталогов:
базовый-auth
форма-auth
пользовательская форма-аутентификация
запуск oauth-запуска
oauth-окта-гитхаб
oauth-окта-стартер
Они соответствуют четырем разделам этого руководства (с тремя для последнего раздела, раздела OAuth). За исключением oauth-запуска
, это полностью функциональные приложения. В этом уроке вы узнаете, что означает код и как его создавать.
Создайте базовый логин HTTP в Spring Boot
Базовая аутентификация – это, ну, в общем, элементарно. Это простая схема, встроенная непосредственно в протокол HTTP. Это происходит из пастырских времен до того, как огромные объемы данных и денег потекли по различным каналам и трубам Интернета. Таким образом, это действительно не очень безопасно. Согласно спецификации, пароль и имя пользователя кодируются с использованием Base64 в заголовке HTTP authorization
. Поскольку Base64 с таким же успехом может быть простым текстом, если вы собираетесь использовать базовую аутентификацию для чего-либо, убедитесь, что вы всегда используете HTTPS/SSL, потому что вы отправляете свои учетные данные для аутентификации с каждым запросом.
Откройте проект basic-auth
Spring Boot с помощью вашей любимой среды разработки или редактора.
Первое, что вы захотите проверить, это файл build.gradle
. Это воспроизведено ниже. Я не буду подробно останавливаться на них всех, но я хочу сориентировать вас на некоторые вещи, происходящие здесь, на случай, если вы еще не знакомы.
plugins { id 'org.springframework.boot' version '2.1.4.RELEASE' id 'java' } apply plugin: 'io.spring.dependency-management' group = 'com.okta.springsecurityauth' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8' repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test' }
В сборку добавляются два плагина Spring: org.springframework.ботинок
и io.spring.управление зависимостями
. Обратите внимание, что версия установлена на 2.1.4.ВЫПУСК
. Одной из реальных проблем Spring в прошлом было управление зависимостями. Spring – это огромная коллекция библиотек, и когда вы добавляете одну, вам нужно добавить другие с совместимыми версиями. Когда вы обновляете один из них, часто это приводит к тому, что другие выходят из совместимости. Исправление этого в прошлом могло привести вас к тому, что называлось “адом зависимости”.
К счастью, весна значительно упростила ситуацию. Посмотрите на наши две весенние зависимости:
dependencies { implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.boot:spring-boot-starter-web' ... }
Обратите внимание, что у них нет номеров версий. В основном это большие мета-зависимости для наборов функций (в данном случае безопасности и Интернета), а плагины Spring управляют всеми зависимостями для вас на основе версии, установленной в этой строке:
id 'org.springframework.boot' version '2.1.4.RELEASE'
Краткое изложение всего этого заключается в том, что в этом файле build.gradle
будет загружена версия Spring Boot версии 2.1.4 и будут добавлены модули веб-функций и функций безопасности. Список всех доступных стартеров с весны можно найти в их документах .
Кроме градации.файл
, на самом деле есть только три других интересующих файла, все файлы Java. Посмотрите в src/main/java/com/okta/проверка подлинности spring security
и ты их увидишь:
Приложение.ява
( основной класс, в котором используется автоматическая магия, – это весь фреймворк Spring Boot)Конфигурация безопасности.ява
(настраивает параметры безопасности)WebController.java
(очень простой контроллер HTTP-запросов)
Приложение.java
является точкой входа в приложение. В данном случае, как и во многих других, это довольно просто. Самое важное – это аннотация @SpringBootApplication
, которая сообщает вашим зависимостям Spring о начальной загрузке всей платформы Spring Boot. Существует, конечно, также метод main()
, в котором класс Application
загружается и запускается Spring.
package com.okta.springsecurityauth; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
WebController.java
является, достаточно умно, вашим контроллером веб-запросов. Он определяет конечные точки запроса и определяет ответы.
package com.okta.springsecurityauth; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class WebController { @RequestMapping("/") @ResponseBody public String index() { return "That's pretty basic!"; } }
В этом случае веб-контроллер возвращает простую строку вместо маршрутизации в файл шаблона, как мы увидим чуть позже. Аннотация @ResponseBody
– это то, что позволяет этому методу напрямую возвращать строку.
Конфигурация безопасности.java
– это то, где происходит действие в этом уроке. Именно здесь Spring Boot настроен на использование базовой аутентификации. Здесь также можно настроить жестко заданного пользователя и пароль по умолчанию (очевидно, это не то, что я бы делал на производстве, но отлично подходит для учебных пособий).
package com.okta.springsecurityauth; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @Configuration public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Override public void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .anyRequest().authenticated() .and() .httpBasic(); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("user") .password("{noop}pass") // Spring Security 5 requires specifying the password storage format .roles("USER"); } }
Если вы посмотрите на метод configure()
, вы увидите, что объект http
используется с его плавным интерфейсом, чтобы указать spring проверять подлинность всех запросов и использовать базовую аутентификацию HTTP. Это довольно тривиально, но в этом интерфейсе есть масса возможностей, как вы увидите через минуту.
Метод configure()
в основном используется в этом руководстве для создания пользователя в диспетчере аутентификации в памяти. Вы создаете пользователя с именем пользователя пользователь
и паролем пропуск
. Пользователю назначена роль ПОЛЬЗОВАТЕЛЬ
.
Вот и все!
Откройте терминал и убедитесь, что вы находитесь в корневом каталоге проекта basic-auth
. Запустите проект с помощью следующей команды:
./gradlew bootRun
Дождитесь завершения загрузки приложения Spring Boot.
Перейдите к http://localhost:8080
.
Вы увидите окно входа в систему.
Войдите в систему с помощью пользователя
и передать
в качестве учетных данных.
Вы попадете на экран успеха, на котором будет написано: “Это довольно просто!”
Настройка входа в систему на основе формы загрузки Spring
При использовании базовой авторизации форма входа в систему фактически создается браузером, а не приложением. Он отображается в виде всплывающего окна без оформления. Это не очень хороший поток и не очень профессионально выглядит.
С некоторыми довольно минимальными изменениями в коде вы можете заставить Spring Boot автоматически генерировать более профессионально выглядящую форму входа. Завершенный код можно найти в подкаталоге form-auth
репозитория GitHub, или вы можете просто внести изменения в проект basic-auth
, если он все еще открыт.
Вы хотите изменить метод configure()
конфигурации SecurityConfiguration.java
файл должен выглядеть так:
@Override public void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .anyRequest().authenticated() .and() .formLogin() .and() .httpBasic(); }
Единственное отличие – это добавление .и().форма входа в систему ()
. В остальном эти два проекта одинаковы.
Запустите его снова, используя ./gradlew Запуск загрузки
.
Перейдите к http://localhost:8080
(возможно, вам потребуется открыть окно инкогнито, чтобы запустить повторную аутентификацию).
На этот раз вы увидите страницу входа в систему, которую Spring создает для вас.
Настройка формы входа в систему Spring Boot
Следующим шагом на нашем пути к все более сложной аутентификации Spring Boot является настройка формы входа. Весна делает это очень легким делом. Однако появилось несколько новых файлов и больше изменений в коде, чем в прошлый раз, поэтому я бы предложил открыть проект, найденный в папке пользовательская форма-авторизация
репозитория.
В файле build.gradle
появилась одна новая зависимость. Это включает механизм создания шаблонов Thymeleaf, механизм создания веб-шаблонов по умолчанию для использования с Spring Boot.
dependencies { ... implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' ... }
Конфигурация безопасности.файл java
теперь выглядит так (для краткости некоторые части опущены):
package com.okta.springsecurityauth; ... @Configuration @EnableWebSecurity public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Override public void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers( "/public/**").permitAll() .anyRequest().authenticated() .and() .formLogin() .loginPage("/login.html") .failureUrl("/login-error.html") .permitAll(); } ... }
Обратите внимание, что .http Основной ()
исчез, а в .formLogin()
появилось несколько новых опций. Здесь вы настраиваете страницу входа в систему и страницу сбоя входа в систему и убедитесь, что они общедоступны.
Также обратите внимание на эту строку:
.antMatchers( "/public/**").permitAll()
Здесь вы делаете каталог общедоступным
в корневом каталоге пути к классам доступным без аутентификации. В каталоге src/main/ресурсы/статические
находится каталог общедоступный
. При запуске приложения все, что находится в каталоге src/main/resources/static
, копируется в путь к классу, поэтому каталог public
заканчивается в корневом каталоге пути к классу, и все файлы в нем будут доступны без аутентификации. Это отлично подходит для таких вещей, как изображения, файлы JavaScript и файлы CSS.
Тот WebController.java
также имеет несколько новых конечных точек:
package com.okta.springsecurityauth; ... @Controller public class WebController { @RequestMapping("/") @ResponseBody public String index() { return "You made it!"; } // Login form @RequestMapping("/login.html") public String login() { return "login.html"; } // Login form with error @RequestMapping("/login-error.html") public String loginError(Model model) { model.addAttribute("loginError", true); return "login.html"; } }
Обратите внимание, что в то время как метод index()
имеет аннотацию @RequestBody
, что означает, что он будет возвращать тело запроса непосредственно в виде строки, метод login()
и ошибка входа в систему()
методы этого не делают. Вместо этого они возвращают имя шаблонов Thymeleaf, которые будет отображать Spring Boot. По умолчанию эти шаблоны находятся в разделе src/main/ресурсы/шаблоны
. Кроме того, обратите внимание, что Ошибка входа в систему()
– это своего рода трюк с маршрутизацией. На самом деле он просто возвращает login.html
шаблон, но с атрибутом ошибки, введенным в модель.
src/main/resources/templates/login.html
– это новый файл. Это файл шаблона входа в систему.
Login page Login page
Wrong user or password
Реальное, подробное объяснение Thymeleaf выходит далеко за рамки этого руководства. Направляйтесь в их веб-сайт , чтобы покопаться в нем, если хотите.
Помните, когда вы сделали каталог общедоступным
общедоступным? Существует очень простая таблица стилей, которая заполняется этой строкой здесь. В основном я включил это, чтобы продемонстрировать один из способов включения статических ресурсов в файлы шаблонов.
Строка ошибки отображается условно на основе атрибута Ошибка входа
модели, который вводится методом LoginError()
контроллера.
Wrong user or password
Кроме этого, это довольно простая форма входа в систему!
Еще раз, ./градлью загрузочный запуск
для его запуска.
Вы увидите стильную, настроенную форму входа в систему:
Войдите в систему снова, используя пользователь:пропуск
и вы увидите наш экран успеха с надписью: “Вы сделали это!”
Вход в систему Spring Boot OAuth 2.0 с помощью GitHub и единого входа- На
До этого момента все ваши проверки подлинности выполнялись локально с использованием специальной встроенной памяти Менеджер аутентификации
. Чаще всего в производстве приложения поддерживают OAuth 2.0 и OIDC (OpenID Connect). OAuth 2.0 – это открытый стандарт авторизации. OIDC построен поверх OAuth 2.0 и добавляет аутентификацию для более полного протокола управления идентификацией.
В этом уроке вы сначала увидите, как добавить единый вход (единый вход) с помощью GitHub. После этого вы узнаете, как использовать Okta, поставщика решений для идентификации программного обеспечения как услуги.
И то, и другое очень просто, и есть реальная выгода в том, чтобы пользователи могли повторно использовать существующих поставщиков удостоверений личности. Принуждение пользователей обрабатывать отдельные надежные пароли для сотен веб-сайтов и управлять ими – это глупая затея, которая в конечном итоге приводит к более слабым паролям и паролям, повторно используемым на нескольких сайтах (увеличивая их уязвимость к атакам); не говоря уже о старом решении для управления паролями “просто нацарапайте его на стикере и прикрепите к монитору”.
Упростите вход в приложение Spring Boot с помощью единого входа на GitHub
Теперь пришло время внедрить клиент GitHub OAuth 2.0.
Во-первых, вам необходимо зарегистрировать новое приложение OAuth на GitHub. Перейти к их веб-сайт и сделайте это сейчас. Заполните значения, как показано ниже.
Обратите особое внимание на URL обратного вызова авторизации , так как это должно быть http://localhost:8080/login/oauth2/code/github
.
Нажмите Зарегистрировать приложение . Обратите внимание на Идентификатор клиента и Секрет клиента , так как они вам понадобятся через секунду.
А теперь вернемся к Яве. Откройте проект oauth-start
в вашей среде разработки.
В файле build.gradle
обратите внимание на пару новых зависимостей:
... dependencies { implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.security:spring-security-oauth2-client' implementation 'org.springframework.security:spring-security-oauth2-jose' ... }
Безопасность, Тимлиф и веб-стартеры все еще там. Однако есть два новых запуска Spring: oauth2-клиент
и oauth2-хосе
.
oauth2-клиент
содержит библиотеки, необходимые для реализации клиента OAuth 2.0. oauth2-jose
содержит некоторые распространенные библиотеки для подписи и шифрования. ХОСЕ расшифровывается как подпись и шифрование объектов Java.
Конфигурация безопасности.файл java
обновлен для входа в систему OAuth:
package com.okta.spring.SpringBootOAuth; ... @Configuration public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Override public void configure(HttpSecurity http) throws Exception { http.antMatcher("/**") .authorizeRequests() .antMatchers("/", "/login**").permitAll() .anyRequest().authenticated() .and() .oauth2Login(); } }
Следует отметить две вещи: 1) все запросы к /| и
login являются общедоступными, и 2) метод
oauth2 Login() является причиной того, что Spring Boot настраивает клиент OAuth 2.0.
Если это кажется слишком простым , вы правы. Часть конфигурации была перенесена в файл application.yml
.
Откройте файл src/main/ресурсы/application.yml
:
spring: thymeleaf: cache: false security: oauth2: client: registration: github: client-id: << your GitHub client ID>> client-secret: << your GitHub client secret >>
Вам нужно заполнить Идентификатор клиента и Секрет клиента сверху в этот файл.
Веб-маршрутизация и шаблоны также изменились. Посмотрите на WebController.java
файл:
package com.okta.spring.SpringBootOAuth; ... @Controller public class WebController { @RequestMapping("/securedPage") public String securedPage(Model model, @RegisteredOAuth2AuthorizedClient OAuth2AuthorizedClient authorizedClient, @AuthenticationPrincipal OAuth2User oauth2User) { model.addAttribute("userName", oauth2User.getName()); model.addAttribute("clientName", authorizedClient.getClientRegistration().getClientName()); model.addAttribute("userAttributes", oauth2User.getAttributes()); return "securedPage"; } @RequestMapping("/") public String index() { return "index"; } }
Этот контроллер определяет две конечные точки, которые возвращают два файла шаблонов:
/
–>src/главная/ресурсы/шаблоны//
–>
src/главная/ресурсы/шаблоны///защищенная страница
В методе защищенная страница()
обратите внимание, как внедрение зависимостей используется для получения информации об аутентифицированном пользователе, чтобы ее можно было внедрить в модель, которая затем передается в файл шаблона.
Тот src/main/resources/templates/index.html
довольно просто:
Home Spring Security SSO
Login
И src/main/resources/templates/securedPage.html
файл шаблона:
Secured Page Secured Page
User Name:Client Name:User Attributes:
Теперь вы готовы попробовать это. Опять же, убедитесь, что вы находитесь в корневом каталоге проекта, и запустите ./gradlew Запуск загрузки
.
Перейдите к http://localhost:8080
и нажмите на ссылку Войти .
Если ваш браузер обходит страницу входа и переходит прямо на /защищенную страницу
конечной точки, откройте браузер инкогнито и повторите попытку.
Во-первых, вам нужно будет авторизовать приложение Spring Boot для входа в систему, чтобы использовать вашу учетную запись Github для входа в систему OAuth.
Далее вы увидите экран входа в систему GitHub OAuth:
Если вы пройдете успешно, вы увидите простую текстовую страницу с надписью “Защищенная страница” жирным шрифтом и отображением некоторой информации о вашем пользователе OAuth.
Довольно мило, да?
Теперь вы собираетесь добавить второго поставщика OAuth: Okta.
Добавьте логин OAuth 2.0 с помощью Okta в свое приложение Spring Boot
Во-первых, перейдите в developer.okta.com и подпишитесь на бесплатную учетную запись разработчика, если у вас ее еще нет.
Как только у вас появится учетная запись, чтобы создать приложение OAuth/OIDC, откройте панель мониторинга разработчика Okta. Нажмите на пункт верхнего меню Приложения , а затем нажмите Добавить приложение .
Выберите Веб в качестве платформы и нажмите Далее .
Дайте приложению имя. Я назвал свой “Вход в систему Spring Boot”, но вы можете назвать свой так, как вам нравится.
Измените URL-адреса перенаправления для входа на http://localhost:8080/login/oauth2/code/okta
.
Остальные значения по умолчанию в порядке.
Нажмите Готово .
Обратите внимание на Идентификатор клиента и Секрет клиента на следующей странице.
Обновите файл application.yml
для Okta:
spring: ... security: oauth2: client: registration: github: client-id: << Your GitHub Client ID >> client-secret: << Your GitHub Client Secret >> okta: client-id: << Your Okta Client ID >> client-secret: << Your Okta Client Secret >> client-name: Okta provider: okta: issuer-uri: https://{yourOktaDomain}/oauth2/default
Вам необходимо добавить записи о регистрации и поставщике Okta, обязательно указав свой Идентификатор клиента , Секрет клиента и эмитента Okta.
Перезапустите приложение, перейдите в http://localhost:8080
, и нажмите на ссылку Войти .
На этот раз вам будет предоставлен выбор поставщиков OAuth. Этот экран автоматически генерируется при загрузке Spring.
Нажмите Okta и вы попадете на страницу входа в Okta (обычное предостережение о выходе из системы и/или применении инкогнито).
Успешно войдите в систему, и вы увидите нашу страницу успеха.
На этом этапе вы обновили проект oauth-start
в папке проекта oauth-github-okta
и увидели, как легко добавить несколько поставщиков OAuth в приложение Spring Boot.
Упростите Вход В Систему OAuth 2.0 С Помощью Стартера Весенней загрузки Okta
Последнее, что вы собираетесь сделать в этом уроке, – это настроить Okta для разрешения регистрации новых пользователей. Однако, прежде чем вы это сделаете, я хочу познакомить вас со стартером Okta Spring Boot. Проект упрощает интеграцию Spring Boot и Okta. README проекта является отличным источником для получения более подробной информации.
Вы собираетесь интегрировать Okta Spring Boot Starter в этот проект и немного упростить конфигурацию. Просто для простоты вы также удалите интеграцию GitHub с OAuth.
Добавьте одну зависимость в файл build.gradle
:
dependencies { ... implementation 'com.okta.spring:okta-spring-boot-starter:1.1.0' ... }
Теперь обновите файл application.yml
:
okta: oauth2: issuer: https://{yourOktaDomain}/oauth2/default client-id: <> client-secret: < > spring: thymeleaf: cache: false
Введите свой Секрет клиента и Идентификатор клиента .
Попробовать это. Беги ./градлью Запуск загрузки
.
Вы должны иметь возможность войти в систему через Okta. На этот раз вам не будет предоставлен выбор поставщиков OAuth 2.0.
Включить Регистрацию Пользователя
Войдите в свой developer.okta.com учетная запись.
Наведите курсор на Пользователи и нажмите на Регистрация .
Включить регистрацию. Кроме того, включите ссылку Показать “Зарегистрироваться” на странице входа… опция. Это приводит к тому, что ссылка на регистрацию отображается на размещенной странице входа в систему.
Войдите в систему снова, используя окно инкогнито. На этот раз вы заметите, что у пользователя есть возможность зарегистрироваться в качестве нового пользователя.
Введите свой адрес электронной почты, пароль и имя; задайте несколько секретных вопросов, и все готово! Вы зарегистрировали нового пользователя для своего приложения с помощью Okta.
Вы можете сделать гораздо больше с помощью опций регистрации самообслуживания Okta. Все это можно настроить и настроить. Взгляните на их документы , чтобы копнуть глубже.
Конечный продукт для этого с использованием Okta Spring Boot Starter и удалением GitHub OAuth находится в каталоге oauth-okta-starter
.
Узнайте больше О параметрах входа в систему Spring Boot и безопасной аутентификации
В этом уроке вы охватили ОГРОМНУЮ территорию. Вы внедрили приложение Spring Boot, используя базовую аутентификацию, аутентификацию на основе форм и настраиваемую аутентификацию на основе форм. Затем вы использовали OAuth 2.0 и OIDC для реализации единого входа с использованием GitHub и Okta. Наконец, вы увидели, как Okta Spring Boot Starter можно использовать для упрощения настройки единого входа OAuth/OIDC в Spring Boot и как разрешить пользователям регистрироваться в Okta для самообслуживания.
Вы можете найти весь код для примеров в этом руководстве на GitHub .
Чтобы углубиться в создание пользовательских форм входа, взгляните на документацию Spring по этому вопросу.
Образец входа в систему Spring Security oauth2 также содержит отличную информацию и другие примеры.
Вот несколько связанных сообщений в блоге, которые демонстрируют, как использовать Spring Boot и Spring Security для входа и аутентификации:
- Простая аутентификация токенов для приложений Java
- Создайте веб-приложение с Spring Boot и Spring Security за 15 минут
- Создайте безопасный API Spring REST
- Создайте простое приложение CRUD с помощью Spring Boot и Vue.js
Если вам понравился этот пост, подписывайтесь на нас в социальных сетях { Твиттер , Facebook , LinkedIn , YouTube }, чтобы знать, когда мы публиковали похожие.
Оригинал: “https://dev.to/oktadev/a-quick-guide-to-spring-boot-login-options-5fjo”