В предыдущей статье рассказывалось о методе интеграции Keycloak с приложением Spring Boot для реализации унифицированной аутентификации и контроля разрешений Часть управления разрешениями напрямую оценивается ролью, чего также достаточно для простых систем. Однако для сложной системы, в которую необходимо интегрировать детальное управление разрешениями, явно нецелесообразно просто полагаться на прямое управление ролью, а прямая связь между самим приложением и ролью также негибкая. В этой статье описывается, как веб-приложения Spring Boot интегрируют Keycloak для реализации детального контроля разрешений.
Обзор основных концепций разрешений Keycloak
Keycloak поддерживает детализированные политики управления разрешениями, которые можно комбинировать со следующими различными механизмами управления доступом:
- Attribute-based access control (ABAC)
- Role-based access control (RBAC)
- User-based access control (UBAC)
- Context-based access control (CBAC)
- Rule-based access control
- Time-based access control
Процесс авторизации Keycloak
Если вы хотите использовать детальное управление разрешениями Keycloak, вам нужно понять три основных процесса:
- Управление ресурсами
- Управление разрешениями и политиками
- Применение политики
Управление ресурсами
Управление ресурсами в основном используется для определения того, какие объекты сервера ресурсов необходимо защитить.
Взаимосвязь между службой ресурса, ресурсом и областью действия (Scope) выглядит следующим образом:
Управление разрешениями и политиками
Политики используются для определения того, какие условия выполняются для доступа к ресурсам, но сами политики не связаны с ресурсами. Чтобы политика действительно воздействовала на соответствующие ресурсы, необходимо настроить разрешения и связать защищаемые ресурсы с политикой.
Применение политики
Применение политики требует интеграции со службой ресурсов.Policy Enforcement Point(PEP, точка выполнения ресурсов), чтобы связаться со службой Keycloak для получения соответствующей информации о разрешениях и т. д., чтобы решить, к каким ресурсам можно получить доступ.
Детальная фоновая конфигурация управления разрешениями Keycloak
Чтобы включить детальное управление разрешениями Keycloak, вам необходимо создать соответствующий клиент и включить службу авторизации. Затем в соответствии с приведенным выше алгоритмом обработки авторизации настройте управление ресурсами, разрешениями и политикой. В этой статье моделируются следующие сценарии настройки, чтобы лучше понять содержимое конфигурации.
Сценарий выглядит следующим образом:
- Приложения, которые необходимо защитить,
/admin
,/customer/view
,/customer/delete
три основных ресурса - имеют
ROLE_ADMIN
Пользователи роли могут получить доступ ко всем ресурсам - имеют
ROLE_CUSTOMER
Пользователи роли могут получить доступ только/customer/view
, другие ресурсы недоступны
Далее давайте посмотрим, как настроить фон Keycloak для смоделированного выше сценария.
Создание ролей и пользователей
-
Создайте 3 персонажей, из которых
ROLE_USER
Привязать ко всем пользователям -
Создайте 2 пользователей и привяжите роли
Создайте клиент и включите службу авторизации
-
Новый клиент
-
настраивать
confidential
тип доступа и включить авторизацию
Настройка ресурсов, политик и разрешений
на клиентеAuthorization
На вкладке есть много вложенных вкладок, которые могут настраивать ресурсы, политики и разрешения.
Конфигурация вкладки настроек
На вкладке «Настройки» находятся некоторые глобальные настройки по умолчанию для авторизации.
Вот 2 важные конфигурации в разделе «Настройки».
-
Policy Enforcement Mode: указывает, как политика выполняется, когда сервер авторизации получает запрос
- Принудительное применение: если для ресурса не настроена связанная политика, доступ по запросу будет запрещен по умолчанию, что также является параметром по умолчанию.
- Разрешающий: запрашивать разрешение на доступ, когда для ресурса не настроена связанная политика.
- Отключено: отключить все политики доступа для всех ресурсов.
-
Decision Strategy: Указывает, как окончательно рассчитываются разрешения, чтобы определить, можно ли авторизовать соответствующий ресурс.
- Утвердительно: по крайней мере одно вычисление разрешения принимает положительное решение.
- Единогласно: все расчеты разрешений должны принимать положительные решения
Конфигурация вкладки "Ресурсы"
Вкладка «Ресурсы» в основном используется для настройки ресурсов, которые необходимо защитить. В данном примере настроены следующие ресурсы, обратите внимание на настройки Scopes
Конфигурация вкладки "Области авторизации"
Конфигурация вкладки Политики
Какие политики в основном настраиваются в разделе «Политики»? Настроенные политики используются для связывания ресурсов с ресурсами в настройках разрешений. Сам Keycloak поддерживает множество политик. Подробное описание политик см. в официальных документах. В этом примере наиболее часто используемая роль — используется стратегия на основе ролей.
Конфигурация вкладки разрешений
Разрешение используется для настройки ресурсов, того, как связывать стратегии и какую стратегию (стратегию принятия решения) использовать, когда имеется несколько связанных стратегий, чтобы в конечном итоге определить, можно ли авторизовать ресурсы.Элементы конфигурации стратегии принятия решений имеют то же значение, что и элементы в разделе «Настройки». выше., здесь повторяться не будем
Интеграция проекта Spring Boot Пример конфигурации кода Keycloak
application.yml Конфигурация Keycloak
keycloak:
realm: demo
auth-server-url: http://127.0.0.1:8080/auth
resource: spring-boot-authz-keycloak-web
ssl-required: external
credentials:
secret: dede7fd6-2817-491c-b7e5-27f65bbb5fc7
use-resource-role-mappings: false
bearer-only: false
autodetect-bearer-only: false
security-constraints:
- authRoles:
- ROLE_USER
securityCollections:
- name: all
patterns:
- /*
policy-enforcer-config:
on-deny-redirect-to: /accessDenied
Профили могут ссылаться на предыдущие статьи, это в основном относится к следующему, естьpolicy-enforcer-config
Элемент конфигурации, указывающий, что текущее приложение обеспечивает детальное управление разрешениями,on-deny-redirect-to
Указывает адрес для перехода при отказе в доступе
Пример кода контроллера
@RequestMapping(value = "/customer/view", method = {RequestMethod.GET})
public String customerView(Model model, HttpServletRequest request) {
KeycloakSecurityContext keycloak = (KeycloakSecurityContext) request.getAttribute(KeycloakSecurityContext.class.getName());
model.addAttribute("authz", keycloak.getAuthorizationContext());
return "customer/view";
}
@RequestMapping(value = "/customer/delete", method = {RequestMethod.GET, RequestMethod.POST})
public String customerDelete(Model model, HttpServletRequest request) {
KeycloakSecurityContext keycloak = (KeycloakSecurityContext) request.getAttribute(KeycloakSecurityContext.class.getName());
model.addAttribute("authz", keycloak.getAuthorizationContext());
return "customer/delete";
}
@RequestMapping(value = "/admin", method = {RequestMethod.GET, RequestMethod.POST})
public String admin(Model model, HttpServletRequest request) {
KeycloakSecurityContext keycloak = (KeycloakSecurityContext) request.getAttribute(KeycloakSecurityContext.class.getName());
model.addAttribute("authz", keycloak.getAuthorizationContext());
return "admin/view";
}
@RequestMapping(value = "/admin/delete", method = {RequestMethod.GET, RequestMethod.POST})
public String adminDelete(Model model, HttpServletRequest request) {
KeycloakSecurityContext keycloak = (KeycloakSecurityContext) request.getAttribute(KeycloakSecurityContext.class.getName());
model.addAttribute("authz", keycloak.getAuthorizationContext());
return "admin/delete";
}
@RequestMapping(value = "/accessDenied", method = {RequestMethod.GET, RequestMethod.POST})
public String accessDenied() {
return "access_denied";
}
Пример Controller в основном передает контекст авторизации Keycloak в модель и указывает соответствующий рендеринг представления.
Образец кода страницы customer/view.ftl
<h1>Customer View</h1>
<div>
<#if authz.hasScopePermission("delete")>
<a href="/customer/delete">delete</a>
</#if>
</div>
На странице используется freemarker, что относительно просто.Конечно, можно использовать и другие движки просмотра.Здесь размещен только пример кода этой страницы.delete
Разрешения области, чтобы иметь возможность видеть ссылку на удаление
Демонстрация эффекта проекта
эффект доступа пользователя клиента
Посетите страницу /customer/view, но я не вижу ссылку для удаления
Посетите страницы /custome/delete, /admin и сразу перейдите на страницу /accessDenied.
эффект доступа администратора
Admin Access Access / Public / View Page, вы можете увидеть ссылку Удалить
Нажмите на ссылку или удалите пользователя-администратора для прямого доступа / клиента / удаления, чтобы правильно отображать страницу
пользователи с правами администратора обычно могут получать доступ к страницам, связанным с /admin
Суммировать
В этой статье кратко представлены концепции, связанные с детальными разрешениями Keycloak, и показано, как настроить серверную часть Keycloak и веб-приложения Spring Boot в простом сценарии моделирования, чтобы реализовать фактическое детальное управление разрешениями. Keycloak сам по себе очень гибок для детальных политик, связанных с разрешениями, и может быть гибко настроен путем выбора или даже комбинирования нескольких политик в соответствии с потребностями реальных сценариев.
Пример кода проекта из этой статьи:spring-boot-authz-keycloak-web