Play 2.5 对某些请求禁用csrf保护

2023-12-06

我正在使用 play Framework v. 2.5.3 编写我的应用程序,并使用官方文档中所述的 CSRF 保护。

public class Filters implements HttpFilters {

@Inject
CSRFFilter csrfFilter;

@Override
public EssentialFilter[] filters() {
    return new EssentialFilter[]{csrfFilter.asJava()};
}}

当然,只要所有请求都需要被过滤,它就可以工作,但其中一些请求应该被绕过。如何配置过滤器以绕过某些指定路由的请求?感谢您的帮助!


你可以装饰CSRFFilter并使用路由路径列表来包含或排除过滤器的应用。

路线路径需要采用编译形式,因此像“/foo/bar”这样的路线将是/profile但是具有动态组件的路线,例如/view/:foo/:bar变成/view/$foo<[^/]+>/$bar<[^/]+>。您可以通过访问未映射的 URL(例如http://localhost:9000/@foo) 处于开发模式时。

import java.util.LinkedList;
import java.util.List;
import javax.inject.Inject;
import akka.util.ByteString;
import play.filters.csrf.CSRFFilter;
import play.libs.streams.Accumulator;
import play.mvc.EssentialAction;
import play.mvc.EssentialFilter;
import play.mvc.Result;
import play.routing.Router;

public class MaybeCsrfFilter extends EssentialFilter {

    private final EssentialFilter csrfFilter;

    private final List<String> applyCsrf = new LinkedList<>();

    @Inject
    public MaybeCsrfFilter(final CSRFFilter csrfFilter) {
        this.csrfFilter = csrfFilter.asJava();

        // alternatively, define the inclusion/exclusion list in the config and inject Configuration to obtain it
        applyCsrf.add("/foo/bar");
        applyCsrf.add("/view/$foo<[^/]+>/$bar<[^/]+>");
    }

    @Override
    public EssentialAction apply(final EssentialAction next) {
        return EssentialAction.of(request -> {
            final Accumulator<ByteString, Result> accumulator;
            final String currentRoute = request.tags().get(Router.Tags.ROUTE_PATTERN);
            if (applyCsrf.contains(currentRoute)) {
                accumulator = csrfFilter.apply(next).apply(request);
            } else {
                accumulator = next.apply(request);
            }
            return accumulator;
        });
    }
}

这是蛮力,您必须使过滤器与包含/排除列表保持同步,但它确实有效。

或者,您可以在routes文件来确定哪些路由不应应用 CSRF 过滤器。

For a routes文件如

#NOCSRF
GET   /foo/bar               controllers.Application.foo()
#NOCSRF
GET   /view/:hurdy/:gurdy    controllers.Application.bar()
GET   /something/else        controllers.Application.bar()

此过滤器实现不会将 CSRF 过滤器应用于其路由之前为的任何操作# NOCSRF。对于这个例子,仅/something/else将应用 CSRF 过滤器。

public EssentialAction apply(final EssentialAction next) {
    return EssentialAction.of(request -> {
        final Accumulator<ByteString, Result> accumulator;
        final String routeComment = request.tags().get(Router.Tags.ROUTE_COMMENTS);
        if ("NOCSRF".equals(routeComment)) {
            accumulator = next.apply(request);
        } else {
            accumulator = csrfFilter.apply(next).apply(request);
        }
        return accumulator;
    });
}

Your Filters定义则变为

public class Filters implements HttpFilters {

    private final MaybeCsrfFilter csrf;

    @Inject
    public Filters(final MaybeCsrfFilter csrf) {
        this.csrf = csrf;
    }

    @Override
    public EssentialFilter[] filters() {
        return new EssentialFilter[]{csrf};
    }
}

不要忘记为以下内容创建绑定MaybeCsrfFilter!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Play 2.5 对某些请求禁用csrf保护 的相关文章

随机推荐

  • 具有来自不同表的多个 Select 语句的 MySQL 存储过程

    我正在尝试从 mysql 存储过程中的不同表中进行多次选择 如下所示 DELIMITER CREATE PROCEDURE NovemberSummary IN branch VARCHAR 60 IN year INT NOT DETER
  • ORA-04091: 表 xx_xx 正在发生变化,触发器/函数可能看不到它

    因此 我必须创建一个触发器 将对名为 passengerlist1 的表所做的更改记录到名为 logs 的额外表中 日志表 create table logs p name varchar 255 p surname varchar 255
  • 如何计算 CoreData 对象的唯一日期?

    我需要一种正确的方法来计算具有 NSDate 类型属性的 CoreData 对象中有多少个唯一的天数 例如 我有以下内容 date 2014 05 15 21 29 12 0000 date 2014 05 15 21 49 34 0000
  • Global.asax 找不到代码隐藏类

    当我尝试运行我继承的 Web 应用程序时 我不断收到此错误 它是在 2010 年为 C 3 5 编写的 并使用 Mvc 2 我已经安装了必要的库 但出现了此错误 错误1 无法加载类型 AdminConsole MvcApplication
  • 如何在C#中提取rar文件?

    我想使用 cmd shell 提取 rar 文件 所以我编写了以下代码 string commandLine c progra 1 winrar winrar e c download TestedU rar c download Proc
  • xpath 不包含 A 和 B

    我怎样才能添加not contains facebook not contains twitter 到我的xpath sites selector xpath h3 class r a href not contains google hr
  • 我可以在哪里获取我的通用应用程序的客户端密钥?

    I m following this guide http msdn microsoft com library windows apps hh465407 to implement push notifications on my app
  • 有没有办法让 Go 的通道表现得像堆栈

    据我所知 默认情况下 Go 通道的行为类似于队列 先进先出 有什么办法可以将它们更改为后进先出吗 基本上 我正在进行搜索 并希望出于内存限制而使用 DFS 而不是 BFS 不 这是不可能的 通道始终是 FIFO 你可以使用包containe
  • 如何增加 OpenGL 缓冲区?

    是否可以在 OpenGL 中增加缓冲区 假设我想使用实例渲染 每次在世界上产生一个新对象时 我都必须使用实例化数据更新缓冲区 在本例中 我有 3 个浮点数的缓冲区 std vector
  • 如何通过镜头让玩家被摧毁?

    我在通过摄像机让玩家被摧毁时遇到了一些麻烦 在我的应用程序中 我让相机跟随玩家 球 但摄像机只能跟随球向上 所以我想要完成的是 当玩家 球 到达界面 屏幕 的底部时 它就会被摧毁 当它被摧毁后 如果弹出一个新的活动 新屏幕 那就太好了 那就
  • Sql server 2008 - 插入大量数据的性能调整功能

    我必须将大量数据插入表中 sqlserver 2008 与 2005 相比 是否有任何新功能可以提高这种情况下的性能 SQL Server 2008 包含MERGETSQL 语句可以加速某些类型的组合 INSERT UPDATE 和 DEL
  • Android 拆分操作栏,操作项位于顶部和底部?

    有没有办法将某些操作项指定到拆分操作栏的顶部 而其他操作项指定到底部 或者是全有或全无 即所有操作项仅进入拆分的底部 目前这是不可能的 请参阅 Android 开发者 Reto Meier 和 Roman Nurik 在 Android 开
  • 类方法和实例方法的区别?

    当我在编程中使用实例方法和类方法时 我总是感到困惑 请告诉我实例方法和类方法之间的区别以及彼此的优点 所有其他答案似乎都被错误的标签所捕获 现已修复 在 Objective C 中 实例方法是当消息发送到类的实例时调用的方法 因此 例如 i
  • 使用 Flexbox 包裹元素

    我刚刚完成了弹性盒课程并且正在练习 所以如果答案涉及弹性盒概念 我将不胜感激 我有 2 个文章元素 我希望第二篇文章始终位于该位置 第一篇文章的文本可以放在它下面 但是 目前每篇文章的大小都受到尊重 我该如何解决这个问题 这是我当前的 HT
  • 是否可以使用 SQL 中的“Where”子句仅显示仅包含字母和数字的字段?

    我希望能够仅选择某个字段同时包含字母和数字的字段 例如 Select field1 field2 from db1 table1 where field2 LETTERS AND NUMBERS 我使用的是 SQL Server 2005
  • 从 iCloud 备份中排除文件

    我使用的是 iOS 5 1 我使用这种和平的代码 pathURL setResourceValue NSNumber numberWithBool YES forKey NSURLIsExcludedFromBackupKey error
  • 在 Codeblocks 中设置 GLUT 项目 (Ubuntu 12.04)

    我通过 apt get 安装了 freeglut3 和 freeglut3 dev 我想在 Codeblocks 中创建一个 OPENGL GLUT 项目 有人问我 GLUT 的位置 我输入了 usr 正如我在教程中找到的那样 但我收到错误
  • 使用活动记录进行计数/分组?

    我有一张包含以下信息的表 id user id points 1 12 48 2 15 36 3 18 22 4 12 28 5 15 59 6 12 31 etc 我想要的是每个 user id 包含最多条目的前 10 个 数组 顺序从高
  • 列表视图选择如何改变事件的工作方式。它叫了两次

    我有列表视图控件 在更改选择时 我会检查 如果所选记录计数大于零 则仅启用组框控件 否则将其禁用 因为 这些控件仅与选定的记录相关 如果没有选择记录 则不应启用它 以下是我的列表视图的选定更改事件 Private Sub lv Select
  • Play 2.5 对某些请求禁用csrf保护

    我正在使用 play Framework v 2 5 3 编写我的应用程序 并使用官方文档中所述的 CSRF 保护 public class Filters implements HttpFilters Inject CSRFFilter