Ответ 1
Spring Безопасность 4.1 +
Spring Теперь Security добавила новый соединитель, который знает вашу конфигурацию, соответствующую URL-адресу Spring MVC. Это сообщает Spring Security для соответствия путям на основе тех же правил, что использует Spring MVC, исключая возможность действительного URL-адреса, но необеспеченного.
Сначала вам нужно заменить старых помощников новым совпадением MVC. Spring Безопасность теперь синхронизирована, однако вы настроили Spring MVC, чтобы вы могли добавлять или удалять любую конфигурацию, соответствующую пути. Я рекомендую придерживаться стандартных по умолчанию.
Конфигурация Java
Если вы использовали antMatchers
, теперь вы должны использовать mvcMatchers
:
protected configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.mvcMatchers("/about").hasRole("USER");
}
Конфигурация XML
Вам нужно добавить атрибут request-matcher
в тэг http
:
<http request-matcher="mvc">
<intercept-url pattern="/about" access="hasRole('USER')"/>
</http>
Обратите внимание, что вы также больше не должны префиксать свои роли с помощью "ROLE_" как Spring Безопасность делает это для вас автоматически.
Spring Безопасность до 4.1
Мне не удалось найти способ обработки как суффикса конечной косой черты, так и суффиксов пути в Spring Security. Очевидно, что для обработки этих случаев можно написать регулярное выражение, но это, по-видимому, делает правила безопасности слишком сложными и подвержен ошибкам. Я хочу быть настолько уверенным, насколько возможно, что я не подвергаю ресурсы случайно.
Поэтому мой подход состоит в том, чтобы отключить это поведение в Spring, сконфигурировав совпадение пути как строгий как с косой чертой, так и с суффиксами.
Конфигурация Java
@Configuration
public class ServletConfig extends WebMvcConfigurerAdapter {
@Override
public void configurePathMatch(final PathMatchConfigurer configurer) {
configurer.setUseSuffixPatternMatch(false);
configurer.setUseTrailingSlashMatch(false);
}
}
Конфигурация XML
<mvc:annotation-driven>
<mvc:path-matching suffix-pattern="false" trailing-slash="false" />
</mvc:annotation-driven>