В Spring Security 5.2 вы можете настроить несколько IDP с помощью RelyingPartyRegistrationRepository
.
Каждый из них выглядит примерно так при использовании Spring Boot:
spring:
security:
saml2:
relyingparty:
registration:
idpone:
identityprovider:
verification:
credentials:
- certificate-location: "classpath:idpOne.crt"
entity-id: https://idp.example.org
sso-url: https://idp.example.org/SSOService.saml2
idptwo:
identityprovider:
...
Затем вы можно инициировать запрос AuthNRequest для idpOne
, указав значение http://localhost:8080/saml2/authenticate/idpOne
.
По имени хоста
Если вы хотите сделать это по имени хоста, то вы можете настроить страницу /login
, чтобы узнать, какая из /saml2/authenticate/{registrationId}
конечных точек для перенаправления.
Сначала вы скажете Spring Security, что у вас есть пользовательская страница /login
, поэтому она не создает одну:
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) {
http
.authorizeRequests(authz -> authz
.mvcMatchers("/login").permitAll() // here
.anyRequest().authenticated())
.saml2Login(saml2 -> saml2.loginPage("/login")) // and here
}
}
И тогда вы бы его определили:
@Controller
public class LoginController {
private final RelyingPartyRegistrationRepository relyingParties;
// ... constructor
@GetMapping("/login")
public void login(HttpServletRequest request, HttpServletResponse response) {
String registrationId = // ... derive from the host name
RelyingPartyRegistration relyingParty = this.relyingParties
.findByRegistrationId(registrationId);
if (relyingParty == null) {
response.setStatusCode(401);
} else {
response.sendRedirect("/saml2/authenticate/" + registrationId);
}
}
}
Причина поиска в конечной точке /login
состоит в том, чтобы убедиться, что registrationId
, указанный в имени хоста, является допустимым.