Я использую Spring Boot 3 с Spring Security 6 и Spring Security SAML Service Provider.
У меня есть метод Bean, который настраивает запрос при запуске, но я не нашел способа изменить определенные части запроса, используя пользовательский ввод, например, Saml2AuthenticationRequestResolver.
В моем случае содержимое RequestedAuthnContext должно изменяться в зависимости от уровня доверия во время выполнения.
Я пытался создать пользовательский RequestResolver, но не смог найти никакой информации об этом в документации этой библиотеки. Поэтому мне не удалось решить эту задачу.
Ответ
Ваша задача — изменить параметры SAML AuthnRequest на этапе выполнения в приложении Spring Boot, используя Spring Security и Spring Security SAML. Для изменения RequestedAuthnContext
на основе пользовательского ввода, вам необходимо создать собственное решение для обработки запросов.
Вот пошаговая инструкция, как это сделать:
Шаг 1: Создайте класс для настройки AuthnRequest
Создайте класс, который будет реализовывать интерфейс Saml2AuthenticationRequestResolver
и переопределяет метод resolve
.
import org.springframework.security.saml2.provider.service.authentication.Saml2AuthenticationRequestResolver;
import org.springframework.security.web.authentication.AuthenticationRequestRedirectFilter;
import org.springframework.stereotype.Component;
import org.springframework.security.saml2.core.AuthnRequest;
import org.springframework.security.saml2.core.RequestedAuthnContext;
import org.springframework.security.saml2.core.Saml2AuthenticationRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class CustomSaml2AuthenticationRequestResolver implements Saml2AuthenticationRequestResolver {
@Override
public Saml2AuthenticationRequest resolve(HttpServletRequest request, HttpServletResponse response) {
String trustLevel = request.getParameter("trustLevel"); // Получаем уровень доверия от запроса
AuthnRequest authnRequest = generateAuthnRequest(trustLevel);
return new Saml2AuthenticationRequest(authnRequest);
}
private AuthnRequest generateAuthnRequest(String trustLevel) {
// Создайте AuthnRequest и настройте его, включая `RequestedAuthnContext`
RequestedAuthnContext context = new RequestedAuthnContext();
// Настройка дополнительных параметров AuthnRequest на основе trustLevel
context.setAuthnContextClassRef(trustLevel); // пример, что вы можете настроить на основе trustLevel
AuthnRequest.Builder builder = AuthnRequest.builder();
builder.requestedAuthnContext(context);
return builder.build();
}
}
Шаг 2: Зарегистрируйте кастомный резолвер в конфигурации безопасного контекста
Затем вам нужно интегрировать ваш кастомный Saml2AuthenticationRequestResolver
в контекст безопасности Spring.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
private final CustomSaml2AuthenticationRequestResolver authRequestResolver;
public SecurityConfig(CustomSaml2AuthenticationRequestResolver authRequestResolver) {
this.authRequestResolver = authRequestResolver;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.saml2Login()
.authenticationRequestResolver(authRequestResolver); // Используем ваш кастомный резолвер
}
}
Шаг 3: Добавьте логику для получения trustLevel
В вашем контроллере или сервисе у вас должны быть логика для получения уровня доверия, который будет передан в AuthnRequest
. Например:
@GetMapping("/login")
public String login(@RequestParam String trustLevel) {
// Здесь вы можете выполнять дополнительную логику и перенаправлять пользователей
return "redirect:/saml2/authentication?trustLevel=" + trustLevel;
}
Заключение
Теперь, когда пользователь использует trustLevel
, переданный через URL, ваш кастомный Saml2AuthenticationRequestResolver
будет получать этот параметр и использовать его для изменения RequestedAuthnContext
в SAML AuthnRequest. Убедитесь, что ваш trustLevel
соответствует ожидаемым значениям SAML, чтобы избежать проблем с аутентификацией.
Если потребуется больше помощи, не стесняйтесь задавать дополнительные вопросы!