jBoss 具有安全约束的 CORS 支持
jBoss CORS support with security constraints
我正在使用网络通用安全约束向我的 API 添加身份验证,但它似乎破坏了我的 CORS 过滤器。我以前只使用过滤器而不使用应用程序服务器级别的身份验证。
基本思想是要求对所有请求进行身份验证,但 /rest/account 端点下的请求除外,因为这些是处理初始登录的请求,因此需要公开访问。
在 Chrome 和 Postman returns 中测试 405 Method not allowed 响应,当尝试登录时作为 POST 请求的一部分进行 OPTIONS 调用时。
希望我已经在下面提供了所有相关信息,但如果还需要任何其他信息,请告诉我。提前致谢!
我的 CORS 过滤器
<filter>
<filter-name>CORS</filter-name>
<filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
<init-param>
<param-name>cors.supportedMethods</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.supportedHeaders</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.allowOrigin</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.allowSubdomains</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>cors.supportsCredentials</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CORS</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
我的安全限制
<security-constraint>
<display-name>WebsiteUsers</display-name>
<web-resource-collection>
<web-resource-name>WebsiteAPI</web-resource-name>
<description/>
<url-pattern>/rest/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<description>Standard User authentication</description>
<role-name>Users</role-name>
</auth-constraint>
</security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>Public</web-resource-name>
<description>Matches a few special endpoints</description>
<url-pattern>/rest/account/*</url-pattern>
</web-resource-collection>
<!-- No auth-constraint means everybody has access! -->
</security-constraint>
尝试将 <http-method-omission>OPTIONS</http-method-omission>
添加到受保护的 <web-resource-collection>
。
这应该允许 OPTIONS
请求通过您的 CORS 过滤器(然后将发回正确的 Access-Control-Allow-Methods
响应 header)。
见https://docs.oracle.com/cd/E19798-01/821-1841/bncbk/index.html
或者(如果您需要支持 servlet 规范 < 3.0),您可以定义所有需要身份验证的方法(GET
、POST
、DELETE
、PUT
, 等等 - 除了 OPTIONS
) - 使用 <http-method>
我正在使用网络通用安全约束向我的 API 添加身份验证,但它似乎破坏了我的 CORS 过滤器。我以前只使用过滤器而不使用应用程序服务器级别的身份验证。
基本思想是要求对所有请求进行身份验证,但 /rest/account 端点下的请求除外,因为这些是处理初始登录的请求,因此需要公开访问。
在 Chrome 和 Postman returns 中测试 405 Method not allowed 响应,当尝试登录时作为 POST 请求的一部分进行 OPTIONS 调用时。
希望我已经在下面提供了所有相关信息,但如果还需要任何其他信息,请告诉我。提前致谢!
我的 CORS 过滤器
<filter>
<filter-name>CORS</filter-name>
<filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
<init-param>
<param-name>cors.supportedMethods</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.supportedHeaders</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.allowOrigin</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>cors.allowSubdomains</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>cors.supportsCredentials</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CORS</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
我的安全限制
<security-constraint>
<display-name>WebsiteUsers</display-name>
<web-resource-collection>
<web-resource-name>WebsiteAPI</web-resource-name>
<description/>
<url-pattern>/rest/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<description>Standard User authentication</description>
<role-name>Users</role-name>
</auth-constraint>
</security-constraint>
<security-constraint>
<web-resource-collection>
<web-resource-name>Public</web-resource-name>
<description>Matches a few special endpoints</description>
<url-pattern>/rest/account/*</url-pattern>
</web-resource-collection>
<!-- No auth-constraint means everybody has access! -->
</security-constraint>
尝试将 <http-method-omission>OPTIONS</http-method-omission>
添加到受保护的 <web-resource-collection>
。
这应该允许 OPTIONS
请求通过您的 CORS 过滤器(然后将发回正确的 Access-Control-Allow-Methods
响应 header)。
见https://docs.oracle.com/cd/E19798-01/821-1841/bncbk/index.html
或者(如果您需要支持 servlet 规范 < 3.0),您可以定义所有需要身份验证的方法(GET
、POST
、DELETE
、PUT
, 等等 - 除了 OPTIONS
) - 使用 <http-method>