Spring Security - Аутентификация при запуске

Spring Security - проверка подлинности при запуске

1. обзор

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

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

2. RunAsManager

Первое, что нам нужно сделать, это настроить нашGlobalMethodSecurity и ввести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 (созданных с помощью этого менеджера).

Наконец, получившийся объект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 создан с использованием того же ключа.

4. Контроллер с@Secured

А теперь давайте посмотрим, как использовать замену аутентификации Run-As:

@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. Это является триггером функциональности Run-As - поскольку фреймворк работает с ним по-разному из-за префикса.

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

  • Текущие права доступа пользователя до методаtryRunAs(): [ROLE_USER]

  • Текущие полномочия пользователя внутри методаtryRunAs(): [ROLE_USER, ROLE_RUN_AS_REPORTER]

  • Временный объектAuthentication заменяет существующий объект аутентификации только на время вызова методаtryRunAS()

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() только внутри нашего метода контроллераtryRunAs()

6. Фронтенд

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



Current user authorities:
    user

Generate Report As Super User

Итак, теперь, когда пользователь запускает действие «Generate Report As Super User», он получает временные полномочияROLE_RUN_AS_REPORTER.

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

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

Это руководство основано наcodebase available on GitHub.