使用 grails-spring-security-rest 插件在 /api/login OPTIONS 请求上不允许使用 405 方法(战斗仍在继续......)

2024-02-26

在我的应用程序中,我使用 grails-spring-security-rest 插件,目前正处于构建身份验证流程的阶段。

如果我使用休息客户端,一切都会按预期工作:我可以通过在 json 中发布用户名和密码来登录并取回令牌。完美的!

现在,我正在尝试将整个事情与网络表单集成,当然,浏览器会发送预检OPTIONS要求。

我有一个简单的拦截器设置:

@GrailsCompileStatic
class CorsInterceptor {
    int order = HIGHEST_PRECEDENCE

    CorsInterceptor() {
        matchAll() // match all controllers
        //.excludes(controller:"login")   // uncomment to add exclusion
    }

    boolean before() {
        String origin = request.getHeader("Origin");

        boolean options = "OPTIONS".equals(request.getMethod());
        if (options) {
            if (origin == null) return;
            response.addHeader("Access-Control-Allow-Headers", "origin, authorization, accept, content-type, x-requested-with");
            response.addHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS");
            response.addHeader("Access-Control-Max-Age", "3600");
        }

        response.addHeader("Access-Control-Allow-Origin", origin == null ? "*" : origin);
        response.addHeader("Access-Control-Allow-Credentials", "true");

        true // proceed to controller
    }

    boolean after() { true }

    void afterView() {
        // no-op
    }

}

拦截器可以完美地获取有效的获取请求并将标头添加到响应中。但是,当我尝试发送此消息时:

curl -X "OPTIONS" "http://localhost:8080/api/login" \
    -H "Origin: http://localhost:3000" \
    -H "Content-Type: application/json" \
    -d "{\"username\":\"customer\",\"password\":\"password\"}"

我总是得到405 Method Not Allowed返回并且执行根本没有到达拦截器。

我的假设是插件提供的登录控制器不允许这样做,我需要添加一个额外的 URL 映射来解决这个问题。我的问题是,这个映射支持是什么样的?

另外,可以设置适用于所有 OPTIONS 请求的映射,因此我不需要一一指定它们?

鉴于这一切,这只是我的假设......我的方向正确吗?

Thanks,


许多其他用户也面临这个问题,并且在 github 和 Slack 频道上被反复询问。我创建了一个示例示例,它在 src/ 目录下有 CORS 过滤器,并将其注册为 spring bean。Here is https://github.com/ejaz-ahmed/grails3-springsecurity-rest-demo带有示例应用程序的 github 存储库。 Cors过滤器代码如下

@Priority(Integer.MIN_VALUE)
class CorsFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest req, HttpServletResponse resp, FilterChain chain)
        throws ServletException, IOException {

    String origin = req.getHeader("Origin");

    boolean options = "OPTIONS".equals(req.getMethod());
    if (options) {
        if (origin == null) return;
        resp.addHeader("Access-Control-Allow-Headers", "origin, authorization, accept, content-type, x-requested-with");
        resp.addHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS");
        resp.addHeader("Access-Control-Max-Age", "3600");
    }

    resp.addHeader("Access-Control-Allow-Origin", origin == null ? "*" : origin);
    resp.addHeader("Access-Control-Allow-Credentials", "true");

    if (!options) chain.doFilter(req, resp);
}
}

在 resources.groovy 文件中将其注册为 spring bean,如下所示:

beans = {
    corsFilter(CorsFilter)
}

Here is https://github.com/alvarosanchez/grails-spring-security-rest/issues/256在这个插件的 github 存储库上提出的问题。

Update Grails3 CORS 拦截器插件 https://github.com/appcela/grails3-cors-interceptor已更新以包含 Spring Security Cors Filter。详细使用方法请参考这个样本 https://github.com/appcela/grails3-cors-interceptor-spring-security-rest-sample-app

这个插件比我上面写的servlet过滤器要好得多。

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

使用 grails-spring-security-rest 插件在 /api/login OPTIONS 请求上不允许使用 405 方法(战斗仍在继续......) 的相关文章

随机推荐

  • R:在查询图形参数时防止 par() 打开新窗口

    这个问题说明了一切 有时您需要进行初步计算来格式化绘图 并且您不希望显示窗口 最重要的是抢走焦点 例如 假设您想知道用作边距的行的高度 您可能需要使用 par mai par mar 我经常查询图形参数来定义图形输出 但发现弹出的窗口分散注
  • 为什么我无法在 asp:CheckBox 上设置值?

    没有这个属性Value
  • Slickgrid 水平滚动条覆盖最后一行

    当 Slickgrid 包含在div具有固定宽度和水平滚动条变得必要 该滚动条覆盖最后一行数据 http jsfiddle net ericjohannsen LtsvJ http jsfiddle net ericjohannsen Lt
  • 如何使用 GDAL 从 tiff 和 4 个角纬度和经度创建 geotiff [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一张没有 TIFF 格式地理数据的图像 地图 我需要从我的图像中获取 GeoTIFF 文件 我的地
  • 为什么 tomcat 的数据库连接池有两个选项(tomcat-dbcp 和 tomcat-jdbc)?

    我想将数据库连接池添加到现有应用程序 我找到了两个基于tomcat的库tomcat dbcp and tomcat jdbc 我刚刚遇到麻烦了 我应该选择哪一个 总之 Tomcat 提交团队成员的注释 请参阅here https bz ap
  • 使用私有构造函数实例化内部类

    我正在尝试使用反射来创建类的实例 但它是内部密封的并且有私有构造函数 我想知道如何初始化它 并且作为框架的一部分 我只能使用反射将其取出 internal sealed class ABC private ABC string passwo
  • 为什么“pip3 install netifaces”在 Debian 10 Buster 上失败?

    我在 AWS EC2 上设置了一个新的 Debian 10 Buster 实例 并且能够安装依赖于 netifaces 的 pip3 软件包 但是当我第二天返回时 该软件包崩溃并报告 netifaces 中的错误 如果我尝试运行 pip3
  • iPhone 应用内购买商店工具包错误 -1003“无法连接到 iTunes Store”

    我一直致力于添加应用内购买 并且能够使用 Store Kit 创建和测试应用内购买 耶 在测试过程中 我以一种导致应用程序在购买过程中崩溃的方式运行了我的应用程序 所以我猜接收 paymentQueue updatedTransaction
  • Bash 命令替换给出奇怪的不一致输出

    由于与此问题无关的某些原因 我不是直接在 bash 脚本中运行 Java 服务器 而是通过单独的子 shell 下的命令替换在后台运行 该子命令的目的是返回 Java 服务器的进程 ID 作为其标准输出 有问题的片段如下 launch da
  • 在 C++ 标识符中使用下划线的规则是什么?

    在 C 中 使用某种前缀来命名成员变量是很常见的 以表示它们是成员变量 而不是局部变量或参数 如果您有 MFC 背景 您可能会使用m foo 我也见过myFoo偶尔 C 或者可能只是 NET 似乎建议仅使用下划线 如下所示 foo C 标准
  • 我想使用 pyqt5 的拖放方法获取并显示图像

    我想使用 pyqt5 的拖放方法获取并显示图像 例如 像这张图片一样 我想制作拖放空间和图像显示空间 import sys from PyQt5 QtWidgets import QPushButton QWidget QLineEdit
  • CUDA 编译器 (nvcc) 宏

    是否有我可以使用的 CUDA 的 define 编译器 nvcc 宏 如 Windows 的 WIN32 等 我需要这个用于 nvcc 和 VC 编译器之间通用的头代码 我知道我可以继续定义我自己的并将其作为参数传递给 nvcc 编译器 D
  • C++:像使用数组一样使用 std::vector 是否安全?

    我需要有一个固定大小的元素数组 并调用它们需要了解它们如何放置在内存中的函数 特别是 功能类似于glVertexPointer 需要知道顶点在哪里 它们彼此之间有多远等等 在我的例子中 顶点将是要存储的元素的成员 要获取此数组中元素的索引
  • ggplot2:颜色随 y 轴值变化的条形图

    我有这个简单的代码 数据 条形图 dat lt c Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec val lt c 2 5 3 2 5 3 3 1 0 2 6 4 3 5 5 2 1 9 2
  • 使用 perl Archive::Zip 创建 *.epub -- epubchecker 错误

    我正在编写一个 perl 脚本 它将从给定的父文件夹中压缩一组文件并创建一个 epub 文件 该过程工作正常 我可以在 adobe 数字版本中打开 epub 但我收到 epubchecker 错误 Required MTA INF cont
  • 在.NET Core项目中引用外部DLL

    我有自己的 dll 文件 我曾经在 Nodejs 中与 Edge js 一起使用 我现在尝试将它与 dot net core 应用程序一起使用 但没有找到 没有如何访问它或定义它 有没有类似的东西 files MyLibrary dll o
  • 使用 FileOpenPicker 打开本地数据路径

    数据 我的文件 我想在我的 Hololens 应用程序中打开上面的数据路径 该路径位于我的应用程序文件夹 HoloApp Data myFiles 的本地 据我了解 执行此操作的主要方法是使用 FileOpenPickers 我读过API
  • 如何计算置信区间并将其绘制在条形图上

    我怎样才能绘制出一个条形图 data 1x10 cell 其中单元格中的每个值都有不同的尺寸 例如 3x100 3x40 66x2 等 我的目标是获得一个条形图 其中有 10 组条形图 每组中每个值有 3 个条形图 在条形图上 我希望它显示
  • 在 MATLAB 中使用 ROI

    我有一个 MATLAB 期末项目 需要帮助 我构建了一个 GUI 并使用显示图像imshow功能 现在我想要 从图像中选择区域并获取所选区域的像素 我知道 ROI 方法 但我不知道如何使用它 所以如果 有人可以向我解释一下 谢谢 如果您有图
  • 使用 grails-spring-security-rest 插件在 /api/login OPTIONS 请求上不允许使用 405 方法(战斗仍在继续......)

    在我的应用程序中 我使用 grails spring security rest 插件 目前正处于构建身份验证流程的阶段 如果我使用休息客户端 一切都会按预期工作 我可以通过在 json 中发布用户名和密码来登录并取回令牌 完美的 现在 我