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();
        }
    }
}

Обратите внимание, что на самом деле это не разные экземпляры приложения, поэтому вы не будете перенаправлены на страницу входа в систему, если вы аутентифицируетесь как определенный пользователь, а затем перейдете в область, где вы не авторизованы.

Другие вопросы по тегам