当前位置: 首页 > 知识库问答 >
问题:

如何在Wildfly 8上的picketbox/undertow中捕获FailedLoginException以应用CORS

堵存
2023-03-14

在ContainerResponseFilter的帮助下,我可以将CORS头应用于所有传出的响应,而在ExceptionMapper中,我可以对所有错误和异常进行同样的处理,除了PicketBox/Undertow应该在Wildfly中抛出的任何与身份验证相关的异常。

无论我尝试什么,我的ExceptionMapper都无法捕捉到它,结果前端无法读取401状态,因为响应没有追加CORS头(XHR HTTP状态代码变成0)。

我使用这个PBKDF2设置来对MySQL数据库进行身份验证,起初我认为可能因为身份验证是在一个单独的模块中运行的,所以我的应用程序不会捕捉到它,但是即使在将所有的身份验证代码移到我自己的应用程序中之后,我也会遇到同样的问题。

这是我在尝试使用错误密码进行身份验证时得到的日志条目(当我根本不发送任何凭据时,我得到的日志条目非常相似):

2014-11-29 16:11:08,053 TRACE[org.jboss.security](默认任务-4)Pbox000224:End getAppConfigurationEntry(PBKDF2DatabaseDomain),AuthInfo:AppConfigurationEntry[]:[0]LoginModule Class:com.example.myApplication.security.SaltedDatabaseServerLoginModule ControlFlag:LoginModule ControlFlag:LoginModule ControlFlag:required选项:name=DSJNDINAME,name=rolesquery,value=select角色,“roles”来自帐户,其中帐户id=?

这是我的ExceptionMapper类(当前设置为捕获所有Throwables但徒劳地试图使其工作):

@Provider
public class NotAuthorizedExceptionMapper implements ExceptionMapper<Throwable>{

@Override
public Response toResponse(Throwable exception) {
    Response response = Response.status(Response.Status.UNAUTHORIZED).build();
    response.getHeaders().putSingle("Access-Control-Allow-Origin", "*");
    response.getHeaders().putSingle("Access-Control-Allow-Methods", "OPTIONS, GET, POST, PUT, DELETE");
    response.getHeaders().putSingle("Access-Control-Allow-Headers", "origin, content-type, accept, authorization, access-control-allow-origin, access-control-allow-methods, access-control-allow-headers, allow, content-length, date, last-modified");
    return response;
}

我可以做些什么来捕捉这些身份验证异常并因此向它们追加CORS?

共有1个答案

陆卓
2023-03-14

最后,我设法发现可以通过修改配置文件(standalone.xml),向Wildfly上的所有无错误输出响应添加自定义头。这为我解决了问题:

    <subsystem xmlns="urn:jboss:domain:undertow:1.1">
        <buffer-cache name="default"/>
        <server name="default-server">
            <https-listener name="default" socket-binding="https" security-realm="ApplicationRealm"/>
            <host name="default-host" alias="localhost">
                <location name="/" handler="welcome-content"/>
                <filter-ref name="cors-origin"/>
                <filter-ref name="cors-methods"/>
                <filter-ref name="cors-headers"/>
            </host>
        </server>
        <servlet-container name="default">
            <jsp-config/>
        </servlet-container>
        <handlers>
            <file name="welcome-content" path="${jboss.home.dir}/welcome-content"/>
        </handlers>
        <filters>
            <response-header name="cors-origin" header-name="Access-Control-Allow-Origin" header-value="your-domain-here.com"/>
            <response-header name="cors-methods" header-name="Access-Control-Allow-Methods" header-value="OPTIONS, GET, POST, PUT, DELETE"/>
            <response-header name="cors-headers" header-name="Access-Control-Allow-Headers" header-value="origin, content-type, accept, authorization, access-control-allow-origin, access-control-allow-methods, access-control-allow-headers, allow, content-length, date, last-modified, if-modified-since"/>
        </filters>
    </subsystem>

编辑:原来Wildfly并没有将CORS头添加到未经授权的响应中,但是当它遇到500个错误时,它会非常巧妙地忽略它们。任何关于如何解决这个问题的想法都将受到高度赞赏。

 类似资料:
  • 问题内容: 我有以下代码: 我想捕获HTML响应?我该怎么做呢?我可以向form1.submit方法注册任何回调函数吗? 问题答案: 使用普通的javascript,您将无法轻松做到这一点。发布表单时,表单输入将发送到服务器,页面会刷新- 数据在服务器端处理。也就是说,该函数实际上不返回任何东西,它只是将表单数据发送到服务器。 如果您真的想用Javascript获得响应(无需刷新页面),则需要使用

  • 我有一个基于springboot的restful Web服务。我有CryptoResponseBodyAdvision从控制器捕获响应,从响应体中创建JWE并将JWE作为API响应发送。公共类CryptoResponseBodyAdvice实现ResponseBodyAdvice 当某些异常发生并请求到达异常解决程序时,麻烦就来了。在这种异常场景中,响应不受CryptoResponseBodyAd

  • 问题内容: 我正在寻找有关如何存储在对象内部的对象上调用的方法的pythonic解决方案。 因为在python中,如果我想捕获例如方法,我将像这样重载该运算符: 例如,如果要捕获一个具有其他属性的函数,我将使用此函数: 现在,我要寻找的是一种通用解决方案,可以捕获和存储on上调用的任何类型的函数,而无需实现所有重载和其他情况。如您所见,我还想存储方法的属性值(如果有多个,则 存储 在列表中? )。

  • 问题内容: 我正在研究启动多个进程和数据库连接的python脚本。我不时地想用信号杀死脚本,我想进行一些清理。 在Perl中,我可以这样做: 如何在Python中做类似的事情? 问题答案: 用以下方式注册你的处理程序: 代码改编自此处。

  • PicketBox 是一个 Java 安全框架,为开发者提供了下列功能: Authentication Support. Authorization Support. Audit Support. Security Mapping Support. 此外,我们还提供了一个 Oasis XACML v 2.0 兼容引擎。

  • 问题内容: 我们有一个有效的Apache mod_ssl配置。我想为Undertow启用HTTPS支持,以便它侦听http和https,从而消除了对Apache的需求。 我研究了Undertow的javadocs。Undertow.Builder类具有两个具有以下签名的addHttpsListener方法: 所以看来我可以在使用Builder API引导Undertow时使用它们,例如 我不确定如