При определении новых ресурсов REST для весенней загрузки я часто забываю также создать конфигурацию безопасности Spring для их шаблонов 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 предоставляется всем (потому что он еще не настроен)!
Если они начинаются с одного и того же шаблона, например: / api / ..., вы можете запретить эти шаблоны URL-адресов, используя безопасность Spring. В противном случае эти URL-адреса всегда открыты для пользователей.




Вы можете отклонить все запросы по умолчанию с помощью: .anyRequest().denyAll()
и явные запросы разрешения с .hasRole
Spring Контроль доступа на основе выражений имеет выражение denyAll, которое всегда оценивается как false.
Итак, что вы можете сделать, это использовать этот метод denyAll, чтобы запретить доступ ко всему, а затем, возможно, разрешить доступ к определенному URL-адресу через 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 для явного разрешения запросов
Этот ответ почти идентичен ответу Макса.
http.authorizeRequests().antMatchers("/admin/**") .access("hasRole('ADMIN')"позволяет все, кроме всего, что следует за адресом администратора? А можетhttp.authorizeRequests() .antMatchers("/admin*/**").authenticated() .anyRequest().permitAll() .and() .csrf().disable();?