Я использую Spring Security 3.1.4 для защиты приложения Spring MVC 3.2.4, развернутого в Tomcat. У меня есть следующая конфигурация безопасности Spring:
<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/
) и наоборот. Другими словами, URL-адрес с косой чертой и идентичный URL-адрес без косой черты рассматриваются как два разных URL-адреса с помощью Spring Security. Проблема может быть устранена с помощью двух правил безопасности:
<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
рассматриваются как один и тот же URL-адрес Spring MVC. Однако Spring Security рассматривает их как два разных URL-адреса. Таким образом, может потребоваться еще одно правило безопасности:
<intercept-url pattern="/about.*" .../>