Spring Webflux Security разрешает все, кроме одного URL - PullRequest
0 голосов
/ 10 июня 2018

Я хочу разрешить все URL-адреса, определенные в определенном контроллере, кроме одного.

Допустим, мой контроллер предоставляет 3 URL-адреса с базовым URL-адресом /users

  1. "/" перечислить всеusers
  2. "/ {id}" список пользователей по id
  3. "/ admin" получить сведения об уровне администратора пользователя.

Я хочу разрешить доступ 1и 2 URL для любого пользователя, кроме последнего.

Я делал что-то вроде этого

@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
    http.authorizeExchange()
        .pathMatchers("/users/**")
        .permitAll()
        .pathMatchers("/users/admin")
        .hasRole("ADMIN")
        .anyExchange()
        .authenticated()
        .and()
        .httpBasic()
        .and()
        .formLogin();
    return http.build();
}

Но это не работает.Я попробовал и наоборот, то есть

@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
    http.authorizeExchange()
        .pathMatchers("/users/admin")
        .hasRole("ADMIN")
        .anyExchange()
        .authenticated()
        .pathMatchers("/users/**")
        .permitAll()
        .and()
        .httpBasic()
        .and()
        .formLogin();
    return http.build();
}

Это также не работает, заявив, что, поскольку anyExchange() уже зарегистрирован, следующий pathMatcher не может быть достигнут.

1 Ответ

0 голосов
/ 12 июня 2018

Я нашел решение.anyExchange() и authenticated() вызывали проблему.anyExchange() не разрешал добавлять какой-либо сопоставитель пути далее, а authenticated() делал все приложение защищенным, в результате чего каждый URL запрашивал аутентификацию.

Удаление этих двух параметров работало.

@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
    http.authorizeExchange()
        .pathMatchers("/users/admin/**")
        .hasRole("ADMIN")
        .pathMatchers("/**").permitAll()
        .and().httpBasic();
    return http.build();
}
...