1. Общ преглед
Spring Security предоставя няколко механизма за конфигуриране на модел на заявка като незащитен или позволяващ изцяло достъп. В зависимост от всеки от тези механизми - това може или да означава, че изобщо не се изпълнява веригата за филтри за сигурност по този път, или да се изпълнява веригата на филтъра и да се разреши достъп.
2. достъп = ”дозволениеВсички”
Създаване на елемент с достъп = ”allowAll” ще конфигурира упълномощаването така, че всички заявки да са разрешени по този конкретен път:
Или чрез Java конфигурация:
http.authorizeRequests().antMatchers("/login*").permitAll();
Това се постига, без да се деактивират защитните филтри - те продължават да работят, така че всяка свързана с Spring Security функционалност ще остане на разположение.
3. филтри = "няма"
Това е функция преди пролетта 3.1, която е оттеглена и заменена през пролетта 3.1.
На филтри приписват на забрани филтрите Пролет сигурността на веригата изцяло върху тази конкретна заявка път:
Това може да причини проблеми, когато обработката на заявката ще изисква известна функционалност на Spring Security.
Тъй като това е остаряла функция Spring версии, по-нови от 3.0, използването му с Spring 3.1 ще доведе до изключение по време на изпълнение при стартиране:
SEVERE: Context initialization failed org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: The use of "filters='none'" is no longer supported. Please define a separate element for the pattern you want to exclude and use the attribute "security='none'". Offending resource: class path resource [webSecurityConfig.xml] at o.s.b.f.p.FailFastProblemReporter.error(FailFastProblemReporter.java:68)
4. сигурност = "няма"
Както видяхме в съобщението за грешка по-горе, Spring 3.1 заменя филтри = ”none” с нов израз - security = ”none” .
Обхватът също се промени - това вече не е посочено в ниво на елемента. Вместо това Spring 3.1 позволява множествоелементи, които трябва да бъдат дефинирани - всеки със собствена конфигурация на веригата на филтъра за сигурност. И така, новият атрибут за сигурност вече е включен в ниво на елемента.
На практика това ще изглежда така:
Или с конфигурация на Java:
web.ignoring().antMatchers("/resources/**");
Вместо старото:
Подобно на filters = ”none” , това също напълно ще деактивира веригата на филтъра за сигурност за този път на заявка - така че когато заявката се обработва в приложението, функциите Spring Spring няма да бъдат налични.
Това не е проблем за горните примери, които се занимават основно с обслужване на статични ресурси - там, където не се извършва действителна обработка. Ако обаче заявката се обработва програмно по някакъв начин - тогава няма да са налични функционалности за сигурност, като изисква-канал , достъп до текущия потребител или извикване на защитени методи.
По същата причина няма смисъл да се посочват допълнителни атрибути на елемент, който вече е конфигуриран със security = ”none”, тъй като този път на заявка не е защитен и атрибутите просто ще бъдат игнорирани.
Алтернативно, access = 'IS_AUTHENTICATED_ANONYMOUSLY' може да се използва за разрешаване на анонимен достъп.
5. Предупреждения за сигурност = "няма"
При използване на множество елементи, някои конфигурирани със сигурност = ”none” , имайте предвид, че е важен редът, в който са дефинирани тези елементи. Искаме да имаме конкретното пътеки първо, следвайки универсалния модел в самия край.
Също така имайте предвид, че ако елемент не указва модел , а след това по подразбиране, който се преобразува в универсален модел на съвпадение - “/ **” - така че отново този елемент трябва да е последен. Ако редът на елементите не е правилен, създаването на веригата на защитния филтър ще се провали :
Caused by: java.lang.IllegalArgumentException: A universal match pattern ('/**') is defined before other patterns in the filter chain, causing them to be ignored. Please check the ordering in your namespace or FilterChainProxy bean configuration at o.s.s.c.h.DefaultFilterChainValidator.checkPathOrder(DefaultFilterChainValidator.java:49) at o.s.s.c.h.DefaultFilterChainValidator.validate(DefaultFilterChainValidator.java:39)
6. Заключение
Тази статия обсъжда опциите за разрешаване на достъп до път с Spring Security - фокусирайки се върху разликите между филтри = "none", security = "none" и access = "allowAll" .
Както обикновено, примерите са достъпни в GitHub.