Grails spring плагин для ядра безопасности: как удалить приглашение браузера для запроса ajax

Я установил новое приложение grails (2.3.5) и установил плагин ядра безопасности spring (2.0-RC2)

Я добавил следующую конфигурацию (мои 'secure/**' urlmappings используют basicAuthenicationFilter):

grails.plugin.springsecurity.logout.postOnly = false 
 grails.plugin.springsecurity.rejectIfNoRule = true
 grails.plugin.springsecurity.fii.rejectPublicInvocations = false
 //Enable Basic Auth Filter
 grails.plugin.springsecurity.useBasicAuth = true
 grails.plugin.springsecurity.basic.realmName = "Example"
 grails.plugin.springsecurity.filterChain.chainMap = [
 '/secure/**': 'JOINED_FILTERS,-exceptionTranslationFilter',
 'app/**': 'JOINED_FILTERS,-basicAuthenticationFilter,-basicExceptionTranslationFilter'
 ]
grails.plugin.springsecurity.userLookup.userDomainClassName = 'com.car.User'
grails.plugin.springsecurity.userLookup.authorityJoinClassName = 'com.car.UserRole'
grails.plugin.springsecurity.authority.className = 'com.car.Role'
grails.plugin.springsecurity.controllerAnnotations.staticRules = [
 '/app/**': ['permitAll'],
 '/index': ['permitAll'],
 '/index.gsp': ['permitAll'],
 '/**/js/**': ['permitAll'],
 '/**/css/**': ['permitAll'],
 '/**/images/**': ['permitAll'],
 '/**/favicon.ico': ['permitAll']
]

У меня есть приложение angular в папке веб-приложения. В основном, когда я делаю запрос ajax от него и поставляю неверный пароль в базовом заголовке проверки подлинности - мне предлагается приглашение браузера по умолчанию. Запрос еще не выполнен. Я новичок в понимании этого, но мне кажется, что код, который перехватывает запрос, имеет логику для запроса, если заголовок отсутствует или недействителен.

Я уверен, что я должен упустить что-то очевидное, должен быть простой способ настроить поведение для запроса. Есть ли такая конфигурация? Или я должен создать собственный фильтр?

1 ответ

В этом случае используется HTTP Basic Authentication (useBasicAuth = true), сервер возвращает ответ 401 с помощью WWW-Authenticate: Basic, чтобы который браузер отвечает всплывающим окном для имени пользователя и пароля.

Это поведение присутствует во всех браузерах и не может быть изменено, но есть несколько альтернатив. Чтобы избежать всплывающего окна, мы не можем использовать базовую аутентификацию, но какой-то другой механизм.

Самый простой способ - использовать другой заголовок, отличный от заголовка Authorization (используемый в обычной аутентификации) для передачи учетных данных.

Чтобы настроить защиту spring для поиска учетных данных в этом новом заголовке, просмотрите раздел 17.2.1 Аутентификация заголовка запроса, где приведен пример, как настроить RequestHeaderAuthenticationFilter на просмотр данного заголовка.

Вот как выглядит конфигурация с использованием заголовка с именем X-MyCustomHeader для передачи учетных данных:

<security:http>
 <!-- Additional http configuration omitted -->
 <security:custom-filter position="PRE_AUTH_FILTER" ref="customAuthFilter">
 </security:custom-filter></security:http>
 <bean id="customAuthFilter">
 <property name="principalRequestHeader" value="X-MyCustomHeader">
 <property name="authenticationManager" ref="authenticationManager">
 </property></property></bean>
 <bean id="preauthAuthProvider">
 <property name="preAuthenticatedUserDetailsService">
 <bean id="userDetailsServiceWrapper">
 <property name="userDetailsService" ref="userDetailsService">
 </property></bean>
 </property>
 </bean>
 <security:authentication-manager alias="authenticationManager">
 <security:authentication-provider ref="preauthAuthProvider">
 </security:authentication-provider></security:authentication-manager>

В общем случае для приложений с интерфейсом лучше не использовать базовую аутентификацию, так как браузеры кэшируют эти учетные данные, что делает такое приложение уязвимым для запросов на подделку (CSRF).

licensed under cc by-sa 3.0 with attribution.