Как настроить SAML AuthnRequest во время выполнения в приложении Spring Boot?

Вопросы и ответы

Я использую 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, чтобы избежать проблем с аутентификацией.

Если потребуется больше помощи, не стесняйтесь задавать дополнительные вопросы!

Оцените материал
Добавить комментарий

Капча загружается...