gpt4 book ai didi

ajax - Grails spring 安全核心插件 : how to remove the browser prompt for an ajax request

转载 作者:行者123 更新时间:2023-12-05 01:05:22 28 4
gpt4 key购买 nike

我设置了一个新的 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']
]

我在 web-app 文件夹中有一个 angular 应用程序。基本上,当我从它发出 ajax 请求并在基本身份验证 header 中提供错误的密码时 - 系统会提示我使用默认浏览器提示。该请求仍在等待中。我刚开始理解这一点,但我看起来拦截请求的代码有逻辑来提示 header 是否不存在或无效。

我确信我一定遗漏了一些明显的东西,必须有一种简单的方法来配置请求的行为。有这样的配置吗?或者我应该创建一个自定义过滤器?

最佳答案

在这种情况下为 HTTP Basic Authentication正在使用( useBasicAuth = true ),服务器返回一个带有 WWW-Authenticate: Basic 的 401 回复, 浏览器通过弹出的用户名和密码进行回复。

该行为存在于所有浏览器中且无法更改,但有几种替代方法。为了避免弹出窗口,我们不能使用基本身份验证,而是使用其他一些机制。

最简单的方法是使用除 Authorization 之外的另一个 header 。 header (用于基本身份验证)以传递凭据。

要配置 spring security 以在此新 header 上查找凭据,请查看 17.2.1 section Request-Header Authentication ,其中给出了如何配置 RequestHeaderAuthenticationFilter 的示例。查看给定的标题。

这是配置使用名为 X-MyCustomHeader 的 header 查找的方式传递凭据:

  <security:http>
<!-- Additional http configuration omitted -->
<security:custom-filter position="PRE_AUTH_FILTER" ref="customAuthFilter" />
</security:http>

<bean id="customAuthFilter" class="org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter">
<property name="principalRequestHeader" value="X-MyCustomHeader"/>
<property name="authenticationManager" ref="authenticationManager" />
</bean>

<bean id="preauthAuthProvider"
class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
<property name="preAuthenticatedUserDetailsService">
<bean id="userDetailsServiceWrapper"
class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">
<property name="userDetailsService" ref="userDetailsService"/>
</bean>
</property>
</bean>

<security:authentication-manager alias="authenticationManager">
<security:authentication-provider ref="preauthAuthProvider" />
</security:authentication-manager>

一般来说,前端应用程序最好不要使用基本身份验证,因为浏览器会缓存这些凭据,使此类应用程序容易受到请求伪造 (CSRF) 攻击。

关于ajax - Grails spring 安全核心插件 : how to remove the browser prompt for an ajax request,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21465598/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com