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.