Настройка безопасности метода Spring по умолчанию для аутентифицированного - PullRequest
1 голос
/ 28 сентября 2019

Я пытаюсь заставить Spring Boot работать со следующими спецификациями:

  • Контроль доступа должен быть включен в каждый класс контроллера, а не в центральный оператор "http.antMatcher (..").
  • Если программист не включает подробности управления доступом в метод контроллера, он должен по умолчанию установить «любой аутентифицированный пользователь»
  • Следует иметь возможность обозначить некоторые методы как «публичные», доступные длянеаутентифицированные пользователи.

Вот мой пример контроллера:


@Controller
public class ExampleController {

  // this should be available for everyone
  @PreAuthorize("permitAll()")
  @RequestMapping("/")
  @ResponseBody
  public String home() {
    return "Welcome home!";
  }

  // available to every authenticated user
  @PreAuthorize("isAuthenticated()")
  @RequestMapping("hello")
  @ResponseBody
  public String hello() {
    return "world";
  }

  // here we forgot to add Preautorize annotation
  // It should default to Authenticated or not available at all
  @RequestMapping("careless")
  @ResponseBody
  public String careless() {
    return "programmer";
  }

  // this should be available for everyone too
  @PreAuthorize("permitAll()")
  @RequestMapping("free")
  @ResponseBody
  public String free() {
    return "willy";
  }  

}

Я перепробовал много разных конфигураций, ни одна из них не работает должным образом.

Вотнаиболее релевантный, со сравнительной сводной таблицей в конце.

Решение 1 - Нет переопределения Создайте класс, который расширяет WebSecurityConfigurerAdapter без переопределения чего-либо, и настройте EnableGlobalMethodSecurity.


@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)
public class MethodSecurityConfig extends WebSecurityConfigurerAdapter {

}

Не работает, Springs требует логин для всего.

Решение 2 - Переопределить пустым методом

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)
public class MethodSecurityConfig extends WebSecurityConfigurerAdapter {
  protected void configure(final HttpSecurity http) throws Exception {}  
}

Это не работает, потому что Spring по умолчанию "public", если метод не аннотирован.

Решение 3 - настроить переопределение

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)
public class MethodSecurityConfig extends WebSecurityConfigurerAdapter {
  protected void configure(final HttpSecurity http) throws Exception {
    http.antMatcher("/**")  
    .authorizeRequests()  
    .antMatchers("/").permitAll()  
    .anyRequest().authenticated()
    .and().formLogin(); 
  }  
}

Это не 't, Spring не позволяет делать метод общедоступным с аннотацией "allowAll".

В итоге:

|          | Wanted     | Sol-1 no | Sol-2 empty | Sol-3 config. |
|          | Behavior   | override | override    | override      |
|----------|------------|----------|-------------|---------------|
| home     |  public    |  login   |  public     | public        |
| hello    |  login     |  login   |  login      | login         |
| careless |  login     |  login   |  public     | login         |
| free     |  public    |  login   |  public     | login         |

Также было бы приемлемо, если бы не аннотированный метод (небрежно)недоступно для всех.

Как я могу получить требуемое поведение?

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