Grails spring安全核心插件:如何删除ajax请求的浏览器提示

Posted

技术标签:

【中文标题】Grails spring安全核心插件:如何删除ajax请求的浏览器提示【英文标题】:Grails spring security core plugin: how to remove the browser prompt for an ajax request 【发布时间】:2014-02-23 07:02:38 【问题描述】:

我设置了一个全新的 grails 应用程序 (2.3.5) 并安装了 spring security core 插件 (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 请求并在基本身份验证标头中提供错误密码时 - 我会收到默认浏览器提示。该请求仍在等待中。我不熟悉这一点,但我看起来拦截请求的代码有逻辑提示标头是否不存在或无效。

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

【问题讨论】:

我对新的 spring-security-core 插件语法不太熟悉,但看起来您可能缺少 staticRules/secure/**。我现在正在做一个类似的项目,所以我会尝试一下,如果没有人超过我,我会回复。 这会给你任何错误测量吗 如果其相关的身份验证请在您的配置中添加'/secure/*': ['permitAll'], 【参考方案1】:

在这种情况下,当使用HTTP Basic Authentication (useBasicAuth = true) 时,服务器会返回带有WWW-Authenticate: Basic 的 401 回复,浏览器会弹出用户名和密码的弹出窗口来回复该回复。

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

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

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

这是配置如何使用名为 X-MyCustomHeader 的标头来传递凭据:

  <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) 攻击。

【讨论】:

谢谢,这个解释很有道理。我要试试看。

以上是关于Grails spring安全核心插件:如何删除ajax请求的浏览器提示的主要内容,如果未能解决你的问题,请参考以下文章

在 Grails Spring 安全核心插件中配置了两次 Spring 安全核心框架

带有 grails 的 Spring Security 核心插件

Grails - SSL 和 Spring 安全核心

Grails Spring 安全插件 AJAX 身份验证

是否有一种简单或正确的方法来删除spring安全插件?

插件安装后 Grails Apache 中断?