Spring boot - как настроить несколько страниц входа?
Вместе с моей командой мы создали портал Spring application + SAPUI5 с использованием Spring Boot. Например, веб-приложение разделено на три отдельных места:
Веб-приложение: - приложение1 - приложение2 - приложение3
Чтобы получить доступ к этим приложениям, мы реализовали страницу входа. В зависимости от роли пользователя, мы перенаправляем пользователей на точное приложение.
моя весенняя защита приложений выглядит так:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/app1/**/*.*")
.permitAll()
.antMatchers("/register.html")
.permitAll()
//
.antMatchers("/app2/*.*")
.hasRole("USER")
//
//
.antMatchers("/login*")
.permitAll()
.antMatchers("/soap/*")
.permitAll()
.antMatchers("/postLogin")
.authenticated()
//
.antMatchers("/app3/*")
//.permitAll()
.hasRole("ADMIN")
//
.anyRequest()
.authenticated()
// log in
.and()
.formLogin()
.loginPage("/login")
.failureUrl("/login?error=loginError")
.defaultSuccessUrl("/postLogin")
// logout
.and().logout().logoutUrl("/**/logout")
.logoutSuccessUrl("/login").deleteCookies("JSESSIONID").and()
.csrf()
.disable()
и, конечно, у нас есть класс с перенаправлениями. Теперь мы должны предоставить для каждого приложения отдельную страницу входа. Я попытался настроить Spring Security для принятия нескольких форм входа на разных страницах, но это не сработало. Является ли это возможным? Я читаю документацию, но она не дает окончательных результатов.
1 ответ
Вы должны быть в состоянии сделать это путем настройки нескольких объектов HttpSecurity с использованием разных экземпляров. Это похоже на этот вопрос и документацию Spring Security здесь. В основном вы определяете несколько статических классов в своем классе конфигурации, которые расширяют WebSecurityConfigurerAdapter. Я сам использую это для настройки различных типов аутентификации (форма / основной) на основе URL-адресов и сделал быстрый тест, чтобы подтвердить это. Я полагаю, что-то вроде этого в вашем примере (если я правильно читаю ваши намерения):
@EnableWebSecurity
public class MultiHttpSecurityConfig {
@Configuration
@Order(1)
public static class App1ConfigurationAdapter extends WebSecurityConfigurerAdapter {
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/app1/**/*.*")
.permitAll()
.antMatchers("/register.html")
.permitAll()
.anyRequest()
.authenticated()
// log in
.and()
.formLogin()
.loginPage("/login")
.failureUrl("/login?error=loginError")
.defaultSuccessUrl("/postLogin")
// logout
.and().logout().logoutUrl("/**/logout")
.logoutSuccessUrl("/login").deleteCookies("JSESSIONID").and()
.csrf()
.disable();
}
}
@Configuration
public static class App2ConfigurationAdapter extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/app2/*.*")
.hasRole("USER")
// log in
.and()
.formLogin()
.loginPage("/login2")
.failureUrl("/login2?error=loginError")
.defaultSuccessUrl("/postLogin")
// logout
.and().logout().logoutUrl("/**/logout")
.logoutSuccessUrl("/login2").deleteCookies("JSESSIONID").and()
.csrf()
.disable();
}
}
}
Обратите внимание, что на самом деле это не разные экземпляры приложения, поэтому вы не будете перенаправлены на страницу входа в систему, если вы аутентифицируетесь как определенный пользователь, а затем перейдете в область, где вы не авторизованы.