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.