Ответ 1
Вы можете отклонить все запросы по умолчанию с помощью: .anyRequest().denyAll()
и явно разрешить запросы с помощью .hasRole
При определении новых ресурсов REST для весенних загрузок я, как правило, забываю также создать конфигурацию весенней безопасности для своих шаблонов URL.
Как я могу по умолчанию запретить доступ ко всем URL-адресам и разрешать доступ к явно настроенным шаблонам URL? (Я использую .hasRole
для доступа). Я хочу избежать как можно большего количества непредвиденных дыр в системе безопасности.
Скажем, у меня есть три ресурса REST: /jobs
, /desks
и /salary
. Мой текущий код может выглядеть так:
http.authorizeRequests()
.antMatchers(HttpMethod.GET, "/jobs")
.hasRole("my_user")
.antMatchers(HttpMethod.GET, "/desks")
.hasRole("my_user");
Но в настоящее время доступ к url /salary
предоставляется всем (потому что он еще не настроен)!
Вы можете отклонить все запросы по умолчанию с помощью: .anyRequest().denyAll()
и явно разрешить запросы с помощью .hasRole
denyAll
контроля доступа на основе Spring Expression имеет выражение denyAll
которое всегда оценивает значение false
.
Итак, что вы можете сделать, это использовать этот метод denyAll
чтобы запретить доступ ко всему, а затем, возможно, разрешить доступ к определенным URL- hasRole
через hasRole
:
http.authorizeRequests().antMatchers("/admin/**").access("hasRole('ADMIN')").antMatchers("/**").denyAll();
Так, например, это позволит пользователям с доступом ADMIN получить доступ к любой странице, начинающейся с /admin
. И тогда он будет лишен доступа ко всем другим страницам. Обратите внимание, что порядок важен, как если бы вы ввели .antMatchers("/**").denyAll()
первых, он будет отрицать весь доступ и игнорировать остальную часть вашего выражения.
Или, альтернативно, вы можете использовать permitAll()
для определенного шаблона URL:
http.authorizeRequests().antMatchers("/users/**").permitAll().antMatchers("/**").denyAll();
Просто отметьте, что вам, возможно, придется разрешить доступ к каким-либо способам входа в систему, поэтому система может позволить кому-то войти в систему с определенной ролью, поэтому объединить все это вместе и позволить всем попробовать зарегистрироваться, только пользователи-администраторы админ-страницы и отказывать всем остальным, тогда что-то вроде:
http.authorizeRequests().antMatchers("/login").permitAll().antMatchers("/admin/**").access("hasRole('ADMIN')").antMatchers("/**").denyAll();
anyRequest().denyAll()
чтобы отклонить все запросы по умолчанию и .hasRole
для явного разрешения запросов