Spring Security, косые черты и точки в URL
Я использую Spring Security 3.1.4 для защиты приложения Spring MVC 3.2.4, развернутого в Tomcat. У меня есть следующая конфигурация Spring Security:
<http auto-config="true" use-expressions="true">
<http-basic />
<logout ... />
<form-login ... />
<intercept-url pattern="/" access="isAnonymous() or hasRole('ROLE_USER')" />
<intercept-url pattern="/about" access="isAnonymous() or hasRole('ROLE_USER')" />
<intercept-url pattern="/login" access="isAnonymous() or hasRole('ROLE_USER')" />
<intercept-url pattern="/under-construction" access="isAnonymous() or hasRole('ROLE_USER')" />
<intercept-url pattern="/admin-task*" access="hasRole('ROLE_USER') and hasRole('ROLE_ADMINISTRATOR')" />
<intercept-url pattern="/resources/**" access="isAnonymous() or hasRole('ROLE_USER')" />
<intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
</http>
Я заметил, что шаблоны URL без косой черты (например,/about
) не сопоставлять URL с косой чертой (например,/about/
) и наоборот. Другими словами, в Spring Security URL с косой чертой и идентичный URL без косой черты рассматриваются как два разных URL. Проблема может быть решена с помощью двух правил безопасности:
<intercept-url pattern="/about" access="isAnonymous() or hasRole('ROLE_USER')" />
<intercept-url pattern="/about/" access="isAnonymous() or hasRole('ROLE_USER')" />
Есть ли лучшее решение?
я знаю этоpath-type="regex"
позволяет определять шаблоны URL с помощью регулярных выражений, но я хотел бы избежать любой ненужной сложности, если это возможно.
Обновить
Как отметил Адам Гент, существует еще одна проблема, связанная с URL-адресами с точкой:/about.foo
а также/about
Spring MVC обрабатывает один и тот же URL. Однако Spring Security рассматривает их как два разных URL-адреса. Итак, может понадобиться еще одно правило безопасности:
<intercept-url pattern="/about.*" .../>