http://www.keycloak.org/downloads.html
Имя автора: "Автономный серверный дистрибутив".
Установить Keycloak очень просто, шаги следующие:
KEYCLOAK_PATH/bin
,вKEYCLOAK_PATH
это тыKeycloakиз根目录./standalone.sh
,Вы можете запустить Keycloak,Если вам нужно работать в фоновом режиме,затем выполните./standalone.sh &
。После запуска,доступhttp://localhost:8080/
Откроется интерфейс, аналогичный картинке:
Этот интерфейс позволяет нам создать учетную запись администратора для одининициализации. Тогда мы могли бы заполнить его.,Для удобства теста,Мы будем вести учет/Пароли установлены наadmin/admin , а затем нажмите кнопку «Создать», произойдет переход к следующему интерфейсу:
Это видно из рисунка,Учетная запись администратора успешно создана,Инициализация Keycloak также завершена.
Нажмите на изображение вышеAdministration Console
Кнопка, откроется страница входа:
Введите номер счета и пароль, которые мы установили ранее.,и нажмитеLogin in
кнопка для входа в Консоль управления, как показано ниже:
Это видно из рисунка,У Консоль управления достаточно меню,Функции также богаче.,Немного страшно – столько меню,Так много подфункций,Сколько времени нужно на исследование! Это не имеет значения,Вы можете следовать ритму автора,Идите глубже.
Нани? Я как раз говорил об инициации в прошлой статье.,Эта статья об интеграции со Spring Boot? Что это за ритм? Следуйте распорядку дня,Мне не следует вводить этот термин первым,Эта концепция?
Это не имеет значения, Keycloak очень прост, и мы можем понять различные концепции в реальном бою.
Интегрировать Keycloak очень просто, поскольку Keycloak предоставляет нам различные языки и фреймворки. Adapter ,на основеOpenID/SAML
согласованныйAdapter,Около двадцати или около того,Желающие могут перейти по адресу:
http://www.keycloak.org/docs/latest/securing_apps/index.html#openid-connect-3
здесь,мы выбираемOpenIDпротоколвSpring Boot Adapter
Сопутствующие документы:
http://www.keycloak.org/docs/latest/securing_apps/index.html#_spring_boot_adapter
Конечно, если вы знакомы с Spring Security, вы также можете выбрать
http://www.keycloak.org/docs/latest/securing_apps/index.html#_spring_security_adapter
Однако автор полагает, что весну Securityслишком сложный,использоватьSpring Boot Adapter
Уже способны удовлетворить наши потребности,Так что не делай этогоSpring Security Adapter
Понятно。
Предположим, есть весна Bootмикросервисы:
ms-content-sample
http://localhost:8081
http://localhost:8081/articles
,толькоuser-role
Рольизиспользоватьдомашний талантдоступ,test-role
Пользователям роли не разрешен доступ.Далее мы интегрируем Keycloak для этого сервиса и постепенно реализуем единую аутентификацию и авторизацию на основе Keycloak.
Во-первых, нам нужно создать Царство. Область — это концепция изоляции. Пользователи в области A полностью изолированы от пользователей в области B.
Конечно, вы можете сделать это и без Создать. Значение, используйте его напрямую Master Это Realm, но, вообще говоря, для изоляции ресурсов и большей безопасности не рекомендуется делиться Realm с администраторами. Как показано ниже:
Введите имя области. Здесь, как показано на рисунке, мы создаем область с именем Realm.
После создания королевства,мы пришли заms-content-sample
Создатьклиент , нажмите кнопку «Создать» на рисунке ниже.
Заполните информацию о клиенте,Здесь мы создаемодинназванныйms-content-sample
Клиент.
Далее настраиваем Клиент и по пути нажимаем кнопку Изменить:
Настройка Клиент
Как показано на картинке,Мы настраиваем ПонятноAccess Type
дляpublic,Конечно, есть и другие варианты,Напримерbearer-only
,Давайте сначала выберем публичный,bearer-only
Мы поговорим об этом подробно позже;Конфигурация ПонятноValid Redirect URLS
,Это адрес страницы, на которую осуществляется переход после успешной аутентификации.,вмы делаемиспользовать Понятноподстановочный знак;Конфигурация ПонятноBase URL
,Как правило, его можно настроить как домашнюю страницу микросервисов.
относительно простой,Как показано на картинке,Мы создали две роли,user-role
а такжеtest-role
。
Как показано на картинке,Нажмитеuser-role
,и нажмитеAdd selected
,Прямо сейчас Можетдляuser1использоватьраспределение домохозяйствuser-role
Роль;Та же причина,дляuser2использоватьраспределение домохозяйствtest-role
Роль。
Без дальнейших церемоний, давайте перейдем к коду:
на основеSpring Boot Adapter
из Интегрироватьшагнравиться Вниз:
Keycloak adapter
изbom:<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.keycloak.bom</groupId>
<artifactId>keycloak-adapter-bom</artifactId>
<version>3.4.0.Final</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-spring-boot-starter</artifactId>
</dependency>
keycloak:
# Указывает, что это клиент onepublic
public-client: true
# адрес keycloak
auth-server-url: http://localhost:8080/auth
# keycloakвrealm
realm: realm
resource: ms-content-sample
securityConstraints:
- authRoles:
# Следующие пути требуют роли пользователя для доступа
- user-role
securityCollections:
# Вы можете написать имя, как вам нравится
- name: user-role-mappings
patterns:
- /articles
Подробное объяснение элементов конфигурации смотрите в комментариях.
Таким образом, Keycloak интегрируется.
доступhttp://localhost:8081/articles
, используйте пользователя1 Войдите в систему с учетной записью и обнаружите, что к ней можно получить доступ, используя user2; После входа в систему появится следующий интерфейс:
До сих пор,У нас уже есть весну Приложение Boot интегрирует Keycloak и реализует RBAC Контроль разрешений модели.
Во многих сценариях мы надеемся получить основную информацию о текущем пользователе в контроллере, например, имя пользователя, вошедшего в систему, роль и другую информацию. Что делать в это время?
Просто добавьте такой код:
@GetMapping("/articles")
public HashMap<Object, Object> search(Principal principal) {
if (principal instanceof KeycloakPrincipal) {
AccessToken accessToken = ((KeycloakPrincipal) principal).getKeycloakSecurityContext().getToken();
String preferredUsername = accessToken.getPreferredUsername();
AccessToken.Access realmAccess = accessToken.getRealmAccess();
Set<String> roles = realmAccess.getRoles();
log.info("Текущий вошедший в систему пользователь: {}, Роль:{}", preferredUsername, roles);
}
Таким образом, при запросе этого метода будет распечатан журнал, подобный следующему:
2017-12-06 14:51:50.963 INFO 3160 — [nio-8081-exec-3] c.i.yes.controller.ArticleController: Текущий вошедший в систему пользователь: user1, роль: [user-role, uma_authorization]
Разве это не очень просто?
Выйти Это тоже очень просто, просто выполнитеHttpServletRequest.logout()
Метод может быть Выйти.
Пример кода:
@RestController
public class LogoutController {
@GetMapping("/logout")
public String logout(HttpServletRequest request) throws ServletException {
request.logout();
return «Выйти успешно»;
}
}
См. конфигурацию на рисунке ниже, чтобы реализовать отправку электронной почты.
Подробную информацию о шаблоне электронной почты по умолчанию см. $KEYCLOAK_PATH/themes/base/email/html
, написанное на Freemarker. Мы также можем настроить шаблоны писем, подробности см. в разделе «Настройка». раздел темы».
Keycloak с Spring Загрузочное приложение. Итак, весной, с помощью Как интегрировать Keycloak в распределенное приложение, построенное на облаке? ——То есть: Как передать токен доверия Амикросервисы в Бмикросервисы?
Ниже мы разделим на два сценария:
Ниже мы создаемодинновыйизмикросервисыms-consumer-sample
,ДолженмикросервисыделатьиспользоватьFeignнастраиватьиспользоватьвышеизhttp://localhost:8081/articles
интерфейс.
Интегрируйте Spring, как упоминалось выше. Bootизшаг,В том же королевстве,Создать нового клиента,названныйms-consumer-sample
,Ранназаддляms-consumer-sample
микросервисы также интегрируют Keycloak. Ниже мы используем Feign для реализации передачи токенов:
Просто напишите перехватчик Feign:
public class KeycloakRequestInterceptor implements RequestInterceptor {
private static final String AUTHORIZATION_HEADER = "Authorization";
@Override
public void apply(RequestTemplate template) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
Principal principal = attributes.getRequest().getUserPrincipal();
if (principal != null && principal instanceof KeycloakPrincipal) {
KeycloakSecurityContext keycloakSecurityContext = ((KeycloakPrincipal) principal)
.getKeycloakSecurityContext();
if (keycloakSecurityContext instanceof RefreshableKeycloakSecurityContext) {
RefreshableKeycloakSecurityContext.class.cast(keycloakSecurityContext)
.refreshExpiredToken(true);
template.header(AUTHORIZATION_HEADER, "Bearer " + keycloakSecurityContext.getTokenString());
}
}
// В противном случае ничего не делайте
}
}
Это нетрудно увидеть из кода перехватчика,Ставим полученный Токен,Поместите это в заголовок,передан поставщику услуг(Прямо сейчас:ms-content-sample
) 。
так,мы простовыполнить Понятноms-consumer-sample
а такжеms-content-sample
Передача токенов между двумя микросервисами - то есть: единый вход
В приложениях, созданных Spring Cloud, Zuul часто используется как вход к внешним сервисам. Схема архитектуры выглядит следующим образом:
в это время,Мы надеемся добиться: добиться эффекта единой аутентификации на микросервисах Zuul — то есть: авторизоваться на Zuul,Это эквивалентно входу во все микросервисы.
Что делать? На самом деле это вопрос: как передать токен, которому доверяет Zuul, микросервисам, представленным Zuul?
Создаем нового клиента,названныйzuul-server
, а затем напишите фильтр Zuul:
@Component
public class KeycloakRouteZuulFilter extends ZuulFilter {
private static final String AUTHORIZATION_HEADER = "Authorization";
@Override
public String filterType() {
return FilterConstants.ROUTE_TYPE;
}
@Override
public int filterOrder() {
return 1;
}
@Override
public boolean shouldFilter() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
Principal principal = request.getUserPrincipal();
return principal != null && principal instanceof KeycloakPrincipal;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
if (ctx.getRequest().getHeader(AUTHORIZATION_HEADER) == null) {
this.addKeycloakTokenToHeader(ctx);
}
return null;
}
private void addKeycloakTokenToHeader(RequestContext ctx) {
Principal principal = ctx.getRequest()
.getUserPrincipal();
// Причина, по которой здесь можно применить прямое приведение, заключается в том, что определение типа было выполнено в методе mustFilter.
KeycloakSecurityContext keycloakSecurityContext = ((KeycloakPrincipal) principal)
.getKeycloakSecurityContext();
if (keycloakSecurityContext instanceof RefreshableKeycloakSecurityContext) {
ctx.addZuulRequestHeader(AUTHORIZATION_HEADER,
this.buildBearerToken(
(RefreshableKeycloakSecurityContext) keycloakSecurityContext
)
);
}
// Пользователь не авторизован и ничего не делает.
}
private String buildBearerToken(RefreshableKeycloakSecurityContext securityContext) {
return "Bearer " + securityContext.getTokenString();
}
}
Как видно из кода, в этом фильтре мы реализуем передачу Token.
Подробности смотрите в кодеms-consumer-sample
Выше все созданные нами клиенты являются общедоступными. типиз,И теперь,Фактически, только Зуулу необходимо подвергаться воздействию внешнего мира.,Другие сервисы передают токены через Zuul или Feign. поэтому,мы можем удалитьZuulкромеизвсеClientизAccess Type
Изменить вседляbearer-only
, как показано на рисунке:
Подробности смотрите в кодеzuul-server
。
в предыдущей статье,Добавляем пользователей сами,в реальности,Пользователи часто регистрируются дополнительно;,если я хочу достичьRemember Me
Что мне делать с функцией? Нужно ли мне самому все это кодировать? Очевидно, нет! Просто настройте его по мере необходимости, как показано на изображении ниже:
Например,Хотим реализовать регистрацию пользователей,Просто измениUser registration
Проверять Прямо сейчас Может。так Страница входа будет выглядеть как на картинке ниже.:
Срок действия Keycloak немного неприятен, но Keycloak позволяет нам настроить тему ——
После развития темы,каталог темыкопироватьприезжать$KEYCLOAK_PATH/themes
в каталоге. Keycloak по умолчанию готовит для нас два набора тем, как показано ниже:
Мы можем обратиться к этим двум наборам кодов тем, чтобы написать собственную тему. Настройка тема относительно проста и делается с помощью Freemarker. На Universal GitHub также есть несколько тем, просто выполните поиск. keycloak theme можно найти. Отдельные темы довольно хороши.
Многие веб-сайты имеют вход QQ.、Вход на GitHub、Вход в систему Sina Weibo и т. д.сертификация третьей кнопку оплатить. Если мы также хотим получить сертификацию третьей стороной Должен Что делать?Keycloakтакже естьтакизспособность!Ниже автор использует Вход на GitHubдляпример,Реализовать возможность входа в систему с учетной записью GitHub для нашего приложения!
Выполните следующие действия в Keycloak Консоль управления:
Вы увидите интерфейс, аналогичный следующему. На этой странице Клиент. IDа такжеClient Secret
требуется,Как получить значения этих двух элементов?
Войдите в GitHub и посетите github.com/settings/profile
, нажмите слева Developer settings
кнопку, вы увидите интерфейс, аналогичный следующему:
НажмитеNew OAuth App
кнопку, вы увидите интерфейс, аналогичный следующему:
НажмитеRegister application
после кнопки,Прямо сейчас Может看приезжать ДолженотвечатьиспользоватьизClient IDа такжеClient Secret
。
Вернуться к Keycloak Консоль управления,Заполните, чтобы получитьизClient ID
а такжеClient Secret
。
Далее давайте назначим роли пользователям GitHub. Нажмите кнопку «Изменить» на изображении ниже:
Вы увидите интерфейс, аналогичный следующему. Нажмите Создать справа:
Вы увидите интерфейс, аналогичный следующему. Заполните информацию, как показано ниже. Имя не является обязательным. Рекомендуется указать удобочитаемое имя.
Выйтиназад,Для повторного доступалюбомутребуется URL-адрес для входа,Вы увидите интерфейс, подобный следующему:
Как видно на картинке, появилась интересная кнопка входа в GitHub.
доступ zuul/ms-content-sample/articles
,Должен Требуется адресuser-role
Рольталантдоступ。Если это может быть нормальнодоступ。Описание конфигурации успешно выполнено。
прежде чем продолжить,ПонятноразвязатьKeycloak Authorization Service
представлятьизтермини Концепция очень важна。
Согласно OAuth2термин,resource server
размещает защищенные ресурсы и может приниматьи响отвечатьзащищенныйресурс请求изсервер。
resource server
Обычно полагается на какую-то информацию, чтобы решить, разрешить лидоступзащищенныйизресурс。дляна основеRESTfulизresource server
,Долженинформация обычносуществоватьsecurity token
внесли,Обычнодляbearer token
,Отправляется с каждым запросом на сервер. Веб-приложения, которые используют сеансы для аутентификации пользователей, часто хранят эту информацию в сеансе пользователя.,и извлекайте его оттуда для каждого запроса.
В Keycloak,любойconfidential client
отвечатьиспользовать都Может充当resource server
。этотclientизресурсисоответствующийизscopeкприезжатьгруппаauthorization policy
из Защищатьиуправлять。
Ресурс — это часть активов приложения и организации. Это может быть набор конечных точек,одинклассические веб-ресурсы,нравитьсяHTMLСтраницы и т. д.。существоватьauthorization policy
терминсередина,Ресурсы — это защищенные объекты.
Каждый ресурс имеет уникальный идентификатор,Может использоваться для представления одного ресурса или группы ресурсов. Например,您Может以управлятьодинBanking Account Resource
,Долженresourceвстречадлявсе银行账семья定义группаauthorization policy
。но,Вы также можете иметьодинназванныйAlice’s Banking Account
изресурс,Этот ресурс представляет собой один ресурс, принадлежащий клиенту.,это Также возможновладеть собойизгруппаauthorization policy
。
resourceизscope是Можетсуществоватьresourceвыполнить наизограниченныйиздоступобъем。существоватьauthorization policy
терминсередина,Область действия — это один из потенциальных глаголов, который можно логически применить к ресурсу.
Обычно это означает, что для данного ресурса,Что можно сделать. Примерами области действия являются просмотр, редактирование, удаление и т. д. но,Область действия также может быть связана с конкретной информацией, предоставляемой ресурсом. в этом случае,ты можешь иметьproject resource
иcost scope,вcost scope
использовать Ю определениеиспользоватьсемьядоступпроектcostизконкретная стратегияи Разрешения。
Рассмотрим это простое и очень распространенное разрешение:
Разрешение связывает защищенный объект с политикой, которую необходимо оценить, чтобы определить, предоставлено ли разрешение на доступ.
X CAN DO Y ON RESOURCE Z
where …
Keycloak предоставляет богатую платформу,использовать Чтобы построить из простогоприезжатьочень сложный、на основеправилоиздинамичный Разрешения Жди сериюpermission strategy
。этопоставлять Понятногибкость,и помогает:
Политика определяет условия, которые должны быть выполнены для предоставления объекта доступа. Отличие от разрешения,Вам не нужно указывать защищаемые объекты,Вместо этого укажите доступ к данному объекту (например.,resource、область действия или оба) условия, которые должны быть выполнены. политика и что можно использовать для защиты ресурсов、другойиздоступмеханизм управления(access control mechanisms:ACM
)тесно связанный。проходитьpolicy,您Может实施на основесвойствоиздоступконтроль(attribute-based access control:ABAC
),на основе Рольиздоступконтроль(role-based access control:RBAC
),на основеконтекстиздоступконтроль(context-based access control
)или Этииз任意комбинацияиз Стратегия。
Keycloak использует концепцию политик и способы их определения, предоставляя концепцию агрегированных политик, где вы можете создавать «политики». в policy» и по-прежнему контролировать поведение оценки. Keycloak Authorization Service
вpolicyРеализация следует принципу «разделяй и властвуй»изтехнология,Вместо написания большой политики, удовлетворяющей всем условиям, которым должен соответствовать данный ресурс. То есть,Вы можете создать отдельную политику,Затем повторно используйте их с разными разрешениями.,И создавайте более сложные политики, комбинируя отдельные политики.
Policy Provider
специфиченpolicyтипизвыполнить。KeycloakОбеспечивает встроенныйизPolicy,由相отвечатьизPolicy Provider
поддерживать,Вы можете создать свой собственный тип политики для удовлетворения ваших конкретных потребностей.
Keycloakпоставлять ПонятноодинSPI(Service Provider Interface
:интерфейс поставщика услуг),您Может以делатьиспользоватьэто来插入自己изпланService Provider
выполнить。
Permission Билет управляется доступом пользователя OAuth2 ( OAuth2’s User-Managed Access (UMA) Profile :UMA
)Конфигурация文件规范定义из一种特殊типизtoken,этопоставлять Понятносвоего родаauthorization server
Конечноизнепрозрачная структура。Должен结构表示客семья请求изresourceи/илиscope,а также必须отвечатьиспользовать Для запроса авторизационных данных(токен соискателяrequesting party token:[RPT]
)изpolicy。
в УМАсередина,Permission Ticket
дляподдерживатьмежду людьмиизобщийа такжемежду людьми и организациямиизобщий至关重要。дляauthorization workflow
делатьиспользоватьpermission ticket
Можетвыполнить Из простогоприезжатьсложныйизсерия сцен,вresource owner
иresource server
на основе对Этиresourceдоступиз细粒度Стратегия完全контроль其ресурс。
в УМА workflowсередина,authorization server
Кresource server
проблемаpermission ticket
,resource server
Воляpermission ticket
вернуться к попыткедоступзащищенныйресурсизclient。один разclientполучатьприезжатьticket,это就Можетпроходить Воляticketотправить обратноauthorization server
проситьRPT(держатьauthorizationданныеизбольшинствоназадодинжетон)。
связанныйpermission ticket
из Дополнительная информация,Видеть Authorization API
и UMA спецификация.
Автор: Бамбук любит панду Источник: blog.csdn.net/q64261750/article/ подробнее/108263280
Рекомендовано в прошлом
Нажмите на карточку ниже, сосредоточьтесь на Официальный аккаунт“Ти Джей Джун”
Узнавайте что-то удивительное, полезное и интересное каждый день