В этом посте вы рассмотрите различные варианты реализации функции входа в систему с использованием 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”