Веб-приложение Spring Boot интегрирует расширенный детальный контроль разрешений Keycloak

Spring Boot

В предыдущей статье рассказывалось о методе интеграции 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, вам нужно понять три основных процесса:

  • Управление ресурсами
  • Управление разрешениями и политиками
  • Применение политики

Управление ресурсами

Управление ресурсами в основном используется для определения того, какие объекты сервера ресурсов необходимо защитить.

resource-mgmt-process

Взаимосвязь между службой ресурса, ресурсом и областью действия (Scope) выглядит следующим образом:

rs-r-scopes

Управление разрешениями и политиками

Политики используются для определения того, какие условия выполняются для доступа к ресурсам, но сами политики не связаны с ресурсами. Чтобы политика действительно воздействовала на соответствующие ресурсы, необходимо настроить разрешения и связать защищаемые ресурсы с политикой.

policy-mgmt-process

Применение политики

Применение политики требует интеграции со службой ресурсов.Policy Enforcement Point(PEP, точка выполнения ресурсов), чтобы связаться со службой Keycloak для получения соответствующей информации о разрешениях и т. д., чтобы решить, к каким ресурсам можно получить доступ.

pep-pattern-diagram

Детальная фоновая конфигурация управления разрешениями Keycloak

Чтобы включить детальное управление разрешениями Keycloak, вам необходимо создать соответствующий клиент и включить службу авторизации. Затем в соответствии с приведенным выше алгоритмом обработки авторизации настройте управление ресурсами, разрешениями и политикой. В этой статье моделируются следующие сценарии настройки, чтобы лучше понять содержимое конфигурации.

Сценарий выглядит следующим образом:

  • Приложения, которые необходимо защитить,/admin,/customer/view,/customer/deleteтри основных ресурса
  • имеютROLE_ADMINПользователи роли могут получить доступ ко всем ресурсам
  • имеютROLE_CUSTOMERПользователи роли могут получить доступ только/customer/view, другие ресурсы недоступны

Далее давайте посмотрим, как настроить фон Keycloak для смоделированного выше сценария.

Создание ролей и пользователей

  1. Создайте 3 персонажей, из которыхROLE_USERПривязать ко всем пользователям

    fine-grained-authz-role

  2. Создайте 2 пользователей и привяжите роли

    fine-grained-authz-user-1

    fine-grained-authz-user-2

Создайте клиент и включите службу авторизации

  1. Новый клиент

    fine-grained-authz-client-1

  2. настраиватьconfidentialтип доступа и включить авторизацию

    fine-grained-authz-client-2

Настройка ресурсов, политик и разрешений

на клиентеAuthorizationНа вкладке есть много вложенных вкладок, которые могут настраивать ресурсы, политики и разрешения.

Конфигурация вкладки настроек

На вкладке «Настройки» находятся некоторые глобальные настройки по умолчанию для авторизации.

fine-grained-authz-config-settings

Вот 2 важные конфигурации в разделе «Настройки».

  • Policy Enforcement Mode: указывает, как политика выполняется, когда сервер авторизации получает запрос

    • Принудительное применение: если для ресурса не настроена связанная политика, доступ по запросу будет запрещен по умолчанию, что также является параметром по умолчанию.
    • Разрешающий: запрашивать разрешение на доступ, когда для ресурса не настроена связанная политика.
    • Отключено: отключить все политики доступа для всех ресурсов.
  • Decision Strategy: Указывает, как окончательно рассчитываются разрешения, чтобы определить, можно ли авторизовать соответствующий ресурс.

    • Утвердительно: по крайней мере одно вычисление разрешения принимает положительное решение.
    • Единогласно: все расчеты разрешений должны принимать положительные решения

Конфигурация вкладки "Ресурсы"

Вкладка «Ресурсы» в основном используется для настройки ресурсов, которые необходимо защитить. В данном примере настроены следующие ресурсы, обратите внимание на настройки Scopes

fine-grained-authz-config-resources-1

fine-grained-authz-config-resources-2

fine-grained-authz-config-resources-3

fine-grained-authz-config-resources-4

Конфигурация вкладки "Области авторизации"

fine-grained-authz-config-scope

Конфигурация вкладки Политики

Какие политики в основном настраиваются в разделе «Политики»? Настроенные политики используются для связывания ресурсов с ресурсами в настройках разрешений. Сам Keycloak поддерживает множество политик. Подробное описание политик см. в официальных документах. В этом примере наиболее часто используемая роль — используется стратегия на основе ролей.

fine-grained-authz-config-policies-1

fine-grained-authz-config-policies-2

fine-grained-authz-config-policies-3

Конфигурация вкладки разрешений

Разрешение используется для настройки ресурсов, того, как связывать стратегии и какую стратегию (стратегию принятия решения) использовать, когда имеется несколько связанных стратегий, чтобы в конечном итоге определить, можно ли авторизовать ресурсы.Элементы конфигурации стратегии принятия решений имеют то же значение, что и элементы в разделе «Настройки». выше., здесь повторяться не будем

fine-grained-authz-config-permissions-1

fine-grained-authz-config-permissions-2

fine-grained-authz-config-permissions-3

fine-grained-authz-config-permissions-4

Интеграция проекта 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, но я не вижу ссылку для удаления

fine-grained-authz-demo-1

Посетите страницы /custome/delete, /admin и сразу перейдите на страницу /accessDenied.

fine-grained-authz-demo-2

эффект доступа администратора

Admin Access Access / Public / View Page, вы можете увидеть ссылку Удалить

fine-grained-authz-demo-3

Нажмите на ссылку или удалите пользователя-администратора для прямого доступа / клиента / удаления, чтобы правильно отображать страницу

fine-grained-authz-demo-4

пользователи с правами администратора обычно могут получать доступ к страницам, связанным с /admin

fine-grained-authz-demo-5

Суммировать

В этой статье кратко представлены концепции, связанные с детальными разрешениями Keycloak, и показано, как настроить серверную часть Keycloak и веб-приложения Spring Boot в простом сценарии моделирования, чтобы реализовать фактическое детальное управление разрешениями. Keycloak сам по себе очень гибок для детальных политик, связанных с разрешениями, и может быть гибко настроен путем выбора или даже комбинирования нескольких политик в соответствии с потребностями реальных сценариев.

Пример кода проекта из этой статьи:spring-boot-authz-keycloak-web