Spring Security - защита няма, няма филтри, разрешение за достъп All

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.