Я пытаюсь заставить 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 |
Также было бы приемлемо, если бы не аннотированный метод (небрежно)недоступно для всех.
Как я могу получить требуемое поведение?