Spring SAML-подключение ко многим Active DirectoryJAVA

Программисты JAVA общаются здесь
Гость
Spring SAML-подключение ко многим Active Directory

Сообщение Гость »

Я перефразирую вопрос, чтобы было понятнее:
Я не знаю, можно ли это сделать с помощью Spring на веб-сайте, на котором есть его пользователи, внешние пользователи должны войти в систему со своими собственными пользователями Active Directory.
Я хотел бы создать единый вход SAML с помощью Java Spring Multi-Client.
затем с нашего сайта вы можете войти:
  • app.web.com/sso/servidor_1/login
    в этом случае авторизуются люди, зарегистрированные на сервере 1.
[*]app.web.com/sso/servidor_2/login
  • в этом случае регистрируются люди, зарегистрированные на сервере 2. в.
[*]app.web.com/sso/servidor_3/login
  • в этом случае авторизуются люди, зарегистрированные на сервере 3.
[*]после входа в систему они переходят в раздел, где им присваивается токен для входа на основной веб-сайт

[*]и и так против n серверов, которые заходят из сети


мы добились того, что сделали SSO с одним сервер, а не несколько серверов,
и что они меняются в зависимости от URL-адреса.
Это возможно с помощью Spring SAML.
Практично. пример:

Есть музыкальный веб-сайт, и сотрудники CocaCola хотят войти, и сотрудники Pepsi хотят войти,
так что и у CocaCola, и у Pepsi есть свои собственный AD (активный каталог)
с пользователями.
тогда музыкальный веб-сайт будет иметь этот URL-адрес:
webmusic.com/sso/cocacola/login o
webmusic.com/sso/pepsi/login (u или несколько URL-адресов, fanta, redbull)
и эти маршруты перенаправляются на соответствующий AD, затем, когда AD дает добро,
он создается и перенаправляется на сайт Musica с помощью нового токена
создается на основе данных, предоставленных AD.



Я тестирую Java Spring
И я пытаюсь выполнить единый вход для Active Directory, мне удалось его подключить, таким образом.

SamlApplication.java

Код: Выделить всё

package com.test.sso;

import java.security.Key;
import java.util.Base64;
import java.util.Date;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.saml2.provider.service.authentication.Saml2AuthenticatedPrincipal;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm; // !!! deprecation
import io.jsonwebtoken.security.Keys;

@SuppressWarnings("deprecation")
@SpringBootApplication
@Controller
public class SamlApplication {

public static void main(String[] args) {
SpringApplication.run(SamlApplication.class, args);
}

@RequestMapping("/")
public String index() {
return "index";
}

@GetMapping("/hello/{iden}")
public String helloUser(@AuthenticationPrincipal Saml2AuthenticatedPrincipal user, Model model,
@PathVariable("iden") String iden) throws Exception {

model.addAttribute("name", user.getName());
model.addAttribute("iden", iden);

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

if (!authentication.isAuthenticated()) throw new Exception("Access denied.");

System.out.println("iden" + iden);

return "hello"; // ResponseEntity.ok("hello");
}
}

SecurityConfiguration.java

Код: Выделить всё

package com.test.sso;

import static org.springframework.security.config.Customizer.withDefaults;

import java.util.Arrays;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.saml2.provider.service.registration.InMemoryRelyingPartyRegistrationRepository;
import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistration;
import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistrationRepository;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;

@SuppressWarnings("deprecation")
@EnableWebSecurity
@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfiguration {

@Autowired
IdpService idpService;

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.cors(withDefaults())
.csrf(csrf ->  csrf
.disable())
.authorizeRequests(
authorize -> authorize.requestMatchers("/").permitAll().anyRequest().authenticated())
.saml2Login(withDefaults());
return http.build();
}

@Bean
protected RelyingPartyRegistrationRepository relyingPartyRegistrations()
throws Exception {

RelyingPartyRegistration registration = RelyingPartyRegistration
.withRegistrationId("azure-saml")
.assertingPartyDetails(party -> party
.entityId(____ENTITY_ID_AD_______)
.singleSignOnServiceLocation(____SingleSignOnServiceLocation_AD_______)
.wantAuthnRequestsSigned(false)
.verificationX509Credentials(c -> c.add(____URL__Credential_CERT_AD_______)))
.build();

return new InMemoryRelyingPartyRegistrationRepository(registration);
}

@Bean
CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();

configuration.setAllowCredentials(true);

configuration.setAllowedOrigins(
Arrays.asList(null,
"https://*", "http://*",
"https://localhost:8080", "http://localhost:8080/**",
"https://login.microsoftonline.com", "https://login.microsoftonline.com/**",
"https://sts.windows.net", "https://sts.windows.net/**"));
configuration
.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS", "HEAD", "TRACE"));

UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);

return source;
}
}
Это работает при подключении к AD SAML, но если это не лучший способ, то, что я пытаюсь сделать сейчас, это для многих AD SMAL, но я не вижу способа как,
Я новичок в использовании Spring, я также искал и консультировался с ИИ, но не могу достичь какой-либо четкой точки зрения, все, что я пытаюсь сделать, терпит неудачу.
идея заключается в том, что если пользователь вводит:

Код: Выделить всё

- https://_web_/sso/_server-1_/login -> will call AD 1 to search for its users
- https://_web_/sso/_server-2_/login -> will call AD 2 to search for its users
и так далее постоянно, для будущих серверов свой собственный URL и вызов соответствующей конфигурации.
Я не знаю, возможно ли это.
спасибо.

Источник: https://stackoverflow.com/questions/781 ... -directory

Вернуться в «JAVA»