Как запретить доступ ко всем URL-адресам по умолчанию?

При определении новых ресурсов 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 предоставляется всем (потому что он еще не настроен)!

Ответы

Ответ 1

Вы можете отклонить все запросы по умолчанию с помощью: .anyRequest().denyAll() и явно разрешить запросы с помощью .hasRole

Ответ 2

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();

Ответ 3

anyRequest().denyAll() чтобы отклонить все запросы по умолчанию и .hasRole для явного разрешения запросов