Рубрики
Без рубрики

Проверка подлинности Spring Security – Run-As

Настройте приложение безопасности Spring, чтобы позволить пользователю выполнять логику в качестве другого участника с другими привилегиями.

Автор оригинала: baeldung.

1. Обзор

В этом руководстве мы проиллюстрируем, как использовать проверку подлинности от имени в Spring Security с помощью простого сценария.

Очень высокоуровневое объяснение Run-As заключается в следующем: пользователь может выполнить некоторую часть логики в качестве другого участника с другими привилегиями.

2. RunAsManager

Первое, что нам нужно сделать, это настроить нашу Глобальную безопасность метода и ввести RunAsManager .

Это отвечает за предоставление временному объекту Authentication дополнительных привилегий:

@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
    @Override
    protected RunAsManager runAsManager() {
        RunAsManagerImpl runAsManager = new RunAsManagerImpl();
        runAsManager.setKey("MyRunAsKey");
        return runAsManager;
    }
}

Переопределяя runAsManager , мы заменяем реализацию по умолчанию в базовом классе, которая просто возвращает null .

Также обратите внимание на свойство key – фреймворк использует его для защиты/проверки временных Аутентификации объектов (созданных с помощью этого менеджера).

Наконец – результирующий объект Authentication является RunAsUserToken .

3. Конфигурация безопасности

Чтобы аутентифицировать наш временный объект Authentication , мы настроим RunAsImplAuthenticationProvider :

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    ...
    auth.authenticationProvider(runAsAuthenticationProvider());
}

@Bean
public AuthenticationProvider runAsAuthenticationProvider() {
    RunAsImplAuthenticationProvider authProvider = new RunAsImplAuthenticationProvider();
    authProvider.setKey("MyRunAsKey");
    return authProvider;
}

Мы, конечно, настраиваем это с помощью того же ключа, который мы использовали в менеджере, чтобы поставщик мог проверить, что объект RunAsUserToken authentication создан с использованием того же ключа.

4. Контроллер С @Защищенным

Теперь давайте посмотрим, как использовать замену проверки подлинности “Запуск от имени”.:

@Controller
@RequestMapping("/runas")
class RunAsController {

    @Secured({ "ROLE_USER", "RUN_AS_REPORTER" })
    @RequestMapping
    @ResponseBody
    public String tryRunAs() {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        return "Current User Authorities inside this RunAS method only " + 
          auth.getAuthorities().toString();
    }

}

Суть здесь в новой роли – RUN_AS_REPORTER . Это триггер функциональности запуска от имени, поскольку фреймворк работает с ней по-разному из – за префикса.

Когда запрос выполняется по этой логике, у нас будет:

  • Текущие полномочия пользователя перед попыткой Запуска от имени() метода [ ROLE_USER ]
  • Текущие полномочия пользователя внутри попробуйте Выполнить как() метод [ ROLE_USER, ROLE_RUN_AS_REPORTER ]
  • Временный объект Authentication заменяет существующий объект аутентификации только на время вызова метода try Run AS()

5. Услуга

Наконец, давайте реализуем реальную логику – простой уровень обслуживания, который также защищен:

@Service
public class RunAsService {

    @Secured({ "ROLE_RUN_AS_REPORTER" })
    public Authentication getCurrentUser() {
        Authentication authentication = 
          SecurityContextHolder.getContext().getAuthentication();
        return authentication;
    }
}

Обратите внимание, что:

  • Чтобы получить доступ к методу getCurrentUser () , нам нужно ROLE_RUN_AS_REPORTER
  • Таким образом, мы можем вызвать только метод getCurrentUser() внутри нашего метода try Run As() controller

6. Передний конец

Затем мы будем использовать простой интерфейс для тестирования нашей функции запуска от имени:



Current user authorities: 
    user

Generate Report As Super User

Итак, теперь, когда пользователь запускает действие ” Создать отчет как суперпользователь “, он получит временный ROLE_RUN_AS_REPORTER полномочия.

7. Заключение

В этом кратком руководстве мы рассмотрели простой пример использования функции Spring Security Run-As authentication replacement .

Этот учебник основан на кодовой базе , доступной на GitHub .