Страница входа формы безопасности Spring по умолчанию не работает, когда определен antmatcher - PullRequest
1 голос
/ 16 октября 2019

У меня проблема с аутентификацией на основе форм Spring 5. Это только пример на данный момент, так как я пытаюсь выделить проблему, с которой я столкнулся. Я планирую включить эту конфигурацию в более крупный проект с несколькими конфигурациями. Приведенный ниже код (который можно найти в любом месте) работает должным образом:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter
{

  @Override
  protected void configure(AuthenticationManagerBuilder auth) throws Exception
  {
    PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
    auth.inMemoryAuthentication()
        .passwordEncoder(passwordEncoder)
        .withUser("user").password(passwordEncoder.encode("password")).roles("USER");
  }

  @Override
  protected void configure(HttpSecurity http) throws Exception
  {
    http
        .authorizeRequests()
        .anyRequest().authenticated()
        .and()
        .formLogin()
        .and().csrf().disable();
  }
}

и следующий код не работает после добавления antmatcher:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter
{

  @Override
  protected void configure(AuthenticationManagerBuilder auth) throws Exception
  {
    PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
    auth.inMemoryAuthentication()
        .passwordEncoder(passwordEncoder)
        .withUser("user").password(passwordEncoder.encode("password")).roles("USER");
  }

  @Override
  protected void configure(HttpSecurity http) throws Exception
  {
    http.antMatcher("/test/**")
        .authorizeRequests()
        .anyRequest().authenticated()
        .and()
        .formLogin()
        .and().csrf().disable();
  }
}

Обратите внимание, что я только добавилantmatcher к этому конфигу. Я только хочу, чтобы конфигурация применялась к / test / **. И в этом случае я не делаю ничего особенного в отношении формы входа и хотел бы получить форму Spring по умолчанию. Конечно, в реальном приложении я бы не использовал значение по умолчанию, но это только для примера. Мой первый конфиг правильно отображает внутреннюю форму Spring по умолчанию, когда я получаю следующий URL: http://localhost:8080/webapp/test/anything. И я могу успешно пройти аутентификацию. Для второй конфигурации я получаю 404 ошибки при выдаче того же URL-адреса.

Spring Security фактически пытается перенаправить на: http://localhost:8080/webapp/login, однако URL-адрес не существует. Я попробовал следующее изменение:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.antMatcher("/test/**").authorizeRequests().anyRequest().authenticated()
            .and().formLogin().permitAll().loginPage("/test/login").loginProcessingUrl("/test/login")
            .and().logout().logoutUrl("/test/logout").invalidateHttpSession(true).logoutSuccessUrl("/");
}

Это тоже не сработало. Я сделал несколько попыток, но безуспешно. Возможно ли, что поведение формы по умолчанию отключено, когда определен antmatcher?

Ответы [ 2 ]

1 голос
/ 16 октября 2019

Это идеальное решение для ваших требований

@Override
 protected void configure(HttpSecurity http) throws Exception
 {
    http
        .requestMatchers().antMatchers("/test/**", "/customLoginPage", "/logout").and()
        .authorizeRequests()
        .anyRequest().authenticated()
        .and()
        .formLogin()
        .loginPage("/customLoginPage") //If you don't  configure default is "/login"
        .usernameParameter("userName").passwordParameter("password") //In case of custom form parameters
        .defaultSuccessUrl("/app/user/dashboard") //If you don't  configure default is "/"
        .failureUrl("/login?error=true") //If you don't  configure default is "/login?error"
        .and().csrf().disable();
 }

Позвольте мне объяснить некоторые случаи, как пружинная безопасность имеет дело с

Случай 1:

http.authorizeRequests()

равно

http.antMatcher("/**").authorizeRequests()

Будет определен прокси-фильтр, а URL-шаблон для этого фильтра будет "/**". С этим типом конфигурации проблем не будет, так как это подстановочный знак. Но в некоторых случаях мы не хотим определять подстановочный знак "/**", тогда мы должны правильно настроить requestMatchers, в противном случае у нас возникнет множество неосуществимых проблем.

Случай 2:

http.antMatcher("/test/**").authorizeRequests()

Здесь прокси-фильтр будет добавлен с шаблоном URL "/test/**", и запросы с / login и / logout не могут проходить через добавленный фильтр. Чтобы преодолеть это, следует использовать .requestMatchers (), как указано ниже

http
   .requestMatchers().antMatchers("/test/**", "/customLoginPage", "/logout")
   .and().authorizeRequests()

Это означает, что фильтр с отображением фильтра приведен ниже

<filter-mapping>
    <filter-name>/test/**</filter-name>
    <url-pattern>/customLoginPage</url-pattern>
    <url-pattern>/logout</url-pattern>
</filter-mapping>

Вы можете попробовать некоторые из основных примеров (Работа) из моего репозитория github

0 голосов
/ 16 октября 2019

После многих попыток у меня работает следующее. Отображается только метод настройки:

@Override
protected void configure(HttpSecurity http) throws Exception
{
    http.antMatcher("/test/**")
        .authorizeRequests()
        .antMatchers("/test/login").permitAll()
        .antMatchers("/test/logout").permitAll()
        .anyRequest().authenticated()
        .and()
        .formLogin()
            .loginPage("/login.jsp").permitAll()
            .loginProcessingUrl("/test/login").permitAll()
            .failureUrl("/login.jsp?error=yes")
        .and()
        .logout().permitAll().logoutUrl("/test/logout").permitAll()
        .and().csrf().disable();
}

Мне нужно было создать собственную форму входа (login.jsp), однако обработка формы входа (POST) обрабатывается обработкой Spring по умолчанию. Действительно, это была важная часть. Еще один ключевой момент: POST-форма входа должна указывать на / webapp / test / login. Я предполагаю, что конфигурации Spring нужны эти дополнительные «подсказки» для запуска обработки формы по умолчанию в случаях, когда должен присутствовать вызов antMatcher.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...