Я не знаю, можно ли это сделать с помощью Spring на веб-сайте, на котором есть его пользователи, внешние пользователи должны войти в систему со своими собственными пользователями Active Directory.
Я хотел бы создать единый вход SAML с помощью Java Spring Multi-Client.
затем с нашего сайта вы можете войти:
- app.web.com/sso/servidor_1/login
в этом случае авторизуются люди, зарегистрированные на сервере 1.
- в этом случае регистрируются люди, зарегистрированные на сервере 2. в.
- в этом случае авторизуются люди, зарегистрированные на сервере 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");
}
}
Код: Выделить всё
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;
}
}
Я новичок в использовании 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
Я не знаю, возможно ли это.
спасибо.
Источник: https://stackoverflow.com/questions/781 ... -directory