Scala 如何在播放2.6时禁用CSRF过滤器?

Scala 如何在播放2.6时禁用CSRF过滤器?,scala,csrf,postman,playframework-2.6,Scala,Csrf,Postman,Playframework 2.6,我一直试图在Play Framework API中使用Postman,但我一直遇到与CSRF过滤器相关的问题 我浏览了一些论坛(包括SO),寻找解决方案,而众所周知的建议似乎是: play.filters.disabled+=play.filters.csrf.CSRFFilter 转到application.conf文件 我已经尝试过执行该修复,但即使这样做,我仍然会在控制台日志中看到此错误: [warn] p.filters.CSRF - [CSRF] Check failed becau

我一直试图在Play Framework API中使用Postman,但我一直遇到与CSRF过滤器相关的问题

我浏览了一些论坛(包括SO),寻找解决方案,而众所周知的建议似乎是:

play.filters.disabled+=play.filters.csrf.CSRFFilter
转到
application.conf
文件

我已经尝试过执行该修复,但即使这样做,我仍然会在控制台日志中看到此错误:

[warn] p.filters.CSRF - [CSRF] Check failed because no token found in headers for /auth/logout
其中,
/auth/logout
是将
授权
cookie设置为JWT的POST请求

我尝试了许多替代修复,例如将
play.filters.disabled
设置为
[]
null
,允许所有主机通过CORS筛选器,所有3个主机的各种组合,等等,但最终相同的错误出现在我的日志中

对应用程序所做的唯一更改是将CSRF令牌设置为cookie,而不是在会话中,这会将错误更改为:

[warn] p.filters.CSRF - [CSRF] Check failed because none/none for /auth/logout
这让我感到欣慰,至少知道
application.conf
正在正确加载,但它仍然无法解决问题


有没有一种正确的方法来禁用我没有正确使用的CSRF滤波器?是否有其他方法允许邮递员通过CSRF过滤器工作?

尝试在应用程序中添加此代码:

play.filters.hosts {
  allowed = ["."]
}
让我知道这对你有用。
还可以查看官方游戏。

好的,我发现了问题所在,但要找出问题的根源有点棘手

当我将macwire添加到项目中进行依赖项注入时,我必须定义一个定制的应用程序加载器,它需要一个定制的
AppComponents
类。我对
AppComponents
类的声明如下所示:

类AppComponents(上下文:上下文)
从上下文(上下文)扩展内置组件
使用MyModule
带资产组件
含I18N组分
使用play.filters.httpfilters组件

现在很明显,
play.filters.HttpFiltersComponents
具有以下字段:

def httpFilters:Seq[EssentialFilter]=Seq(csrfFilter、SecurityHeaderFilter、allowedHostsFilter)

其中,
csrfFilter
securityHeadersFilter
allowedHostsFilter
是有效的硬编码值。我猜当使用自定义的
ApplicationLoader
时,它会忽略
application.conf
文件中设置的http过滤器(这在我写这篇文章时很明显)

我正在使用的当前解决方法/修复方法是设置
val-httpFilters:Seq[EssentialFilter]=Seq(SecurityHeaderFilter,allowedHostsFilter)
,而不是默认的
HttpFiltersComponents
字段。我可能会对此进行一些修改,以便从配置文件中读入过滤器,但目前这解决了问题

TL;DR:在集成MacWire时添加了一个自定义应用程序加载程序,但没有意识到这会影响配置文件中的字段

编辑 my
ApplicationLoader
中的最后一段代码,用于配置带有macwire的HTTP筛选器,以防其他人需要它。它使用与
HttpFiltersComponents
几乎完全相同的代码,但使用macwire而不是Guice(未定义的变量从
BuiltInComponentsFromContext
继承):

override lazy val httpFilters:Seq[EssentialFilter]={
val wiredInstance:Wired=wiredInModule(此)
val类:Seq[Class[EssentialFilter]={
val disabledFilters=config.get[Seq[String]](“play.filters.disabled”)
val enabledFilters=config.get[Seq[String]](“play.filters.enabled”).filterNot(disabledFilters.contains)
试一试{
用于(filterClassName)
抛出configuration.reportError(“play.filters.enabled”,s“无法加载类$filterClassName”,某些(e))
}
}
}抓住{
案例e:ConfigException.Null=>
无
案例e:ConfigException.Missing=>
无
}
}
class.map(x=>wiredInstance.wiredClassInstance(x))
}

Hmm,不幸的是,这仍然给出了
[warn]p.filters.CSRF-[CSRF]检查失败,因为在/auth/logout
的标题中找不到令牌,无论是否有
play.filters.disabled
set
play.filters.disabled+=play.filters.csrf.CSRFFilter
也在application.conf中找到了问题的根源:当我添加MacWire时,我添加了一个自定义
ApplicationLoader
类,但没有实现在这将导致硬代码过滤器的时间,忽略配置文件。
override lazy val httpFilters: Seq[EssentialFilter] = {
    val wiredInstance: Wired = wiredInModule(this)
    val classes: Seq[Class[EssentialFilter]] = {
        val disabledFilters = config.get[Seq[String]]("play.filters.disabled")
        val enabledFilters = config.get[Seq[String]]("play.filters.enabled").filterNot(disabledFilters.contains)
        try {
            for (filterClassName <- enabledFilters) yield {
                try {
                    environment.classLoader.loadClass(filterClassName).asInstanceOf[Class[EssentialFilter]]
                } catch {
                    case e: ClassNotFoundException =>
                      throw configuration.reportError("play.filters.enabled", s"Cannot load class $filterClassName", Some(e))
                }
            }
        } catch {
            case e: ConfigException.Null =>
                Nil
            case e: ConfigException.Missing =>
                Nil
        }
    }
    classes.map(x => wiredInstance.wireClassInstance(x))
}