Автор: Майкл Гуд
Переводчик: helloworldtang
В этой статье мы познакомим вас с основами установки и настройки сервера Keycloak, как подключить приложение Spring Boot** и сервер Keycloak, а также как использовать его в среде Spring Security.
Keycloak — это решение IAM (управление идентификацией и доступом) с открытым исходным кодом для современных приложений и сервисов.
Keycloak предоставляет такие функции, как единый вход (SSO), Identity Brokering и вход в учетную запись через социальные сети, федерацию пользователей, клиентский адаптер, консоль управления и консоль управления учетными записями. Чтобы узнать больше о Keycloak, посетите официальную страницу.
В этом руководстве мы будем использовать консоль администратора Keycloak для ее настройки, а затем подключим ее к серверу Keycloak с помощью клиентского адаптера Keycloak в приложении Spring Boot.
Keycloak предлагает на выбор несколько дистрибутивов. Однако в этом уроке мы будем использовать автономную версию.
Загрузите Keycloak-3.3.0.Final Standalone Server Release из официальных источников.
Скачав дистрибутив автономного сервера, разархивируем его и запускаем Keycloak в локальном терминале:
unzip keycloak-3.3.0.Final.zip
cd keycloak-3.3.0.Final/bin
./standalone.sh -Djboss.socket.binding.port-offset=100
После выполнения ./standalone.sh Keycloak начнет предоставлять услуги. Когда мы видим сообщение Keycloak 3.3.0.Final (WildFly Core 3.0.1.Final), включенное в вывод консоли, мы знаем, что Keycloak запущен успешно.
Откройте браузер и посетите http://localhost:8180. Мы будем перенаправлены на http://localhost:8180/auth, чтобы создать начального пользователя-администратора:
Давайте создадим пользователя с именем «initial1» и паролем «zaq1!QAZ». Теперь мы видим страницу «Добро пожаловать в Keycloak»:
Теперь мы можем продолжить работу над консолью управления.
Наведем мышкой в левый верхний угол и найдем кнопку «Добавить область»:
Мы назвали его «SpringBootKeycloak»:
Теперь мы перейдем на страницу Clients. Как мы существуем, можно увидеть на изображении ниже.,Keycloak интегрирован с уже встроенным клиентом.:
Нам нужно добавить клиента в приложение, поэтому нажимаем «Создать». Настраиваем новый идентификатор клиента как «login-app»:
На следующей странице в этом руководстве мы сохраним все значения по умолчанию, кроме поля «Действительные URI перенаправления». После настройки вы будете перенаправлены на порт 8081:
Keycloak использует ролевую основу Доступ. Поэтому у каждого пользователя должна быть своя роль. Нам нужно перейти на страницу «Роль»:
Затем мы добавляем роль «пользователь»:
Теперь у нас есть роль, которую можно назначить пользователю, но пока не пользователю. Итак, перейдем на страницу «Пользователи» и добавим нового:
Создаем пользователя «user1»:
Если пользователь создан, информация о пользователе будет отображаться здесь:
Теперь мы можем перейти на вкладку «Учетные данные» и установить пароль «xsw2@WSX»:
Переходим на вкладку «Сопоставление ролей» и назначаем роли пользователей:
Найдите последнюю версию зависимости Spring Boot Keycloak Starter в Maven Central.
Адаптер Spring Boot Keycloakоснован на Автоматическая настройка Spring Boot,Итак, все, что нам нужно сделать, это установить Keycloak Spring Boot, добавленный в наш проект.
Если вы хотите использовать Keycloak в проекте Spring Boot, нам нужно добавить следующие зависимости в файл pom.xml:
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-spring-boot-starter</artifactId>
</dependency>
В дополнение к этому нам также необходимо указать DependencyManagement Keycloak:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.keycloak.bom</groupId>
<artifactId>keycloak-adapter-bom</artifactId>
<version>3.3.0.Final</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
При использовании Spring Boot Keycloak Starter мы можем поддерживать следующие встроенные веб-контейнеры без каких-либо дополнительных зависимостей:
Мы используем Thymeleaf для реализации веб-страниц. Мы создали следующие три страницы:
Код, относящийся к шаблонам Thymeleaf, был размещен на Github.
Веб-контроллер сопоставляет внутренние и внешние URL-адреса с соответствующими шаблонами Thymeleaf:
@GetMapping(path = "/")
public String index() {
return "external";
}
@GetMapping(path = "/customers")
public String customers(Model model) {
addCustomers();
model.addAttribute("customers", customerDAO.findAll());
return "customers";
}
Для URL-пути /customers мы извлекаем все данные о клиентах и добавляем результаты в качестве свойств в модель. Позже мы пройдемся по этим данным о клиентах в Thymeleaf.
Ниже приведены основные свойства, которые необходимо настроить:
keycloak.auth-server-url=http://localhost:8180/auth
keycloak.realm=SpringBootKeycloak
keycloak.resource=login-app
keycloak.public-client=true
Как мы помним, мы запустили Keycloak на порту 8180, поэтому настроили значение keycloak.auth-server-url как URL-адрес сервера аутентификации и настроили область, созданную в консоли администратора Keycloak. Значение, которое мы указали в keycloak.resource, соответствует клиенту, который мы назвали в консоли администратора.
Вот ограничения безопасности, которые мы будем использовать:
keycloak.security-constraints[0].authRoles[0]=user
keycloak.security-constraints[0].securityCollections[0].patterns[0]=/customers/*
Ограничения безопасности, настроенные выше, гарантируют, что только прошедшие проверку подлинности пользователи с ролью «пользователь» смогут получить доступ к /customers/*.
Теперь мы готовы протестировать наше приложение. Чтобы запустить приложение Spring Boot, мы можем легко запустить его через IDE, например Spring Tool Suite (STS), или запустить команду в терминале:
mvn clean spring-boot:run
Заходим на localhost:8080:
Теперь мы нажимаем на ссылку «клиенты», чтобы просмотреть интрасеть, где хранится конфиденциальная информация.
Как видите, нас перенаправили в Keycloak для аутентификации, и нам нужно проверить, авторизован ли текущий пользователь для просмотра этого контента:
Если мы прошли аутентификацию и прошли проверку авторизации Keycloak, мы будем перенаправлены на страницу клиентов с ограниченным доступом:
Теперь мы завершили настройку для подключения Spring Boot к Keycloak и продемонстрировали, как это работает.
Теперь мы обсудим, как использовать Spring Security с существующими приложениями.
Уже включено в Spring Boot Keycloak Starterполагаться.одинKeycloak Spring Адаптер безопасности. Теперь давайте посмотрим, как использовать Spring Интеграция безопасности и Keycloak.
Если мы хотим использовать Spring Security с Spring Boot, мы должны добавить эту зависимость:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>1.5.3</version>
</dependency>
Последнюю версию Spring Boot Starter Security можно найти на Maven Central.
Keycloak предоставляет удобный базовый класс KeycloakWebSecurityConfigurerAdapter для создания экземпляров WebSecurityConfigurer, поскольку для любого приложения, защищенного Spring Security, требуется класс конфигурации, расширяющий WebSecurityConfigurerAdapter:
@Configuration
@EnableWebSecurity
@ComponentScan(basePackageClasses = KeycloakSecurityComponents.class)
class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(
AuthenticationManagerBuilder auth) throws Exception {
KeycloakAuthenticationProvider keycloakAuthenticationProvider
= keycloakAuthenticationProvider();
keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(
new SimpleAuthorityMapper());
auth.authenticationProvider(keycloakAuthenticationProvider);
}
@Bean
public KeycloakSpringBootConfigResolver KeycloakConfigResolver() {
return new KeycloakSpringBootConfigResolver();
}
@Bean
@Override
protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
return new RegisterSessionAuthenticationStrategy(
new SessionRegistryImpl());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http.authorizeRequests()
.antMatchers("/customers*")
.hasRole("user")
.anyRequest()
.permitAll();
}
}
Обратите внимание на код выше:
Поскольку ограничения безопасности были настроены с помощью Spring Security, мы можем удалить соответствующую конфигурацию, ранее настроенную в application.properties. Теперь мы добавим эту конфигурацию в application.properties:
keycloak.principal-attribute=preferred_username
Чтобы получить имя текущего пользователя, нам нужно внедрить параметр Principal в контроллер. Модифицированный код выглядит следующим образом:
@GetMapping(path = "/customers")
public String customers(Principal principal, Model model){
addCustomers();
model.addAttribute("customers", customerDAO.findAll());
model.addAttribute("username", principal.getName());
return "customers";
}
Внутри тега div мы добавим такое приветствие:
<h1>Hello, <span th:text="${username}">--name--</span>.</h1>
Теперь, после прохождения проверок аутентификации и авторизации, страница перейдет на страницу внутренних клиентов, и мы увидим:
В этом руководстве мы настроили сервер Keycloak и использовали этот сервер в приложении Spring Boot.
Мы также увидели, как настроить Spring Security и использовать его с сервером Keycloak. Код, использованный в этой статье, можно найти на Github.