西罗地图';Jersey的身份验证例外';例外情况 前言

西罗地图';Jersey的身份验证例外';例外情况 前言,jersey,guice,shiro,embedded-jetty,Jersey,Guice,Shiro,Embedded Jetty,首先,我对这个问题非常长表示最诚挚的歉意,但我真的不知道如何缩短它,因为每个部分都是一种特殊情况。诚然,我可能对此视而不见,因为我的头撞在墙上已经有几天了,我开始感到绝望 我向所有读过这本书的人表示最崇高的敬意和感谢 目的 我希望能够映射它的子类,通过使用,使用创建嵌入式码头的 环境 Guice 3.0 码头9.2.12.v20150709 泽西岛1.19.1 Shiro 1.2.4 设置 嵌入式Jetty是使用Guice注入器创建的 //为简洁起见省略导入 公共类引导{ 公共静态void

首先,我对这个问题非常长表示最诚挚的歉意,但我真的不知道如何缩短它,因为每个部分都是一种特殊情况。诚然,我可能对此视而不见,因为我的头撞在墙上已经有几天了,我开始感到绝望

我向所有读过这本书的人表示最崇高的敬意和感谢

目的 我希望能够映射它的子类,通过使用,使用创建嵌入式码头的

环境
  • Guice 3.0
  • 码头9.2.12.v20150709
  • 泽西岛1.19.1
  • Shiro 1.2.4
设置 嵌入式Jetty是使用Guice注入器创建的

//为简洁起见省略导入
公共类引导{
公共静态void main(字符串[]args)引发异常{
/*
*ShiroWebModule作为类传递
*因为需要初始化ServletContext
*/
Injector=Guice.createInjector(新服务器模块(MyShiroWebModule.class));
Server=injector.getInstance(Server.class);
server.start();
join();
}
}
ServerModule
绑定Jetty服务器的提供程序:

公共类ServerModule扩展了AbstractModule{

Class这个问题太复杂了,我无法重复,但我看到了一个我认为是答案的问题,如果我发现我错了,我会删除这个答案

您可以这样做:

@Provider
@Singleton
public class ExceptionHandler implements
        ExceptionMapper<AuthenticationException> {

类定义中的注释的优先级低于模块的
configure()
方法中的注释,这意味着您在绑定“手动确保”时正在擦除注释。请尝试删除该行代码,看看是否可以解决问题。如果无法解决问题,请将其保留为删除状态,因为我确信它至少是问题的一部分-该语句会删除那些重要的批注。

我也找不到这样做的方法。似乎Jersey筛选器/处理程序在上未处于活动状态hiro servlet在身份验证期间堆栈。作为专门针对AuthenticationException的解决方法,我选择在我的AuthenticationFilter上覆盖AdviceFilter::cleanup(…)方法,并直接返回自定义消息

public class MyTokenAuthenticatingFilter extends AuthenticatingFilter {

protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) throws Exception {
    // regular auth/token creation
}

@Override
protected void cleanup(ServletRequest request, ServletResponse response, Exception existing) throws ServletException, IOException {

    HttpServletResponse httpResponse = (HttpServletResponse)response;
    if ( null != existing ) {
        httpResponse.setContentType(MediaType.APPLICATION_JSON);
        httpResponse.getOutputStream().write(String.format("{\"error\":\"%s\"}", existing.getMessage()).getBytes());
        httpResponse.setStatus(Response.Status.FORBIDDEN.getStatusCode());
        existing = null; // prevent Shiro from tossing a ServletException
    }
    super.cleanup(request, httpResponse, existing);
}
}

当身份验证成功时,ExceptionMapper对于Jersey控制器上下文中抛出的异常工作正常。

首先感谢您的回答。遗憾的是,这没有改变任何事情;)跟踪日志文件,在我看来,通过扫描或绑定找到的
@提供程序都已注册关于Jersey。就我所尝试的而言,两种方法之间似乎没有任何功能上的差异,甚至使用这两种方法似乎也不会改变任何行为。我用异常处理程序和服务对此进行了测试。@MarkusWMahlberg另一个愚蠢的、低效的尝试:可能是重复的?我有一个POC正在使用它一个简单的应用程序。但我无法启动并运行您的代码来测试您的配置。您介意创建一个完整的运行应用程序并发布到github或其他东西上,这样我就可以测试它了。@peeskillet真棒!会尽快完成的!@MarkusWMahlberg您有没有启动过github?
public class MyTokenAuthenticatingFilter extends AuthenticatingFilter {

protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) throws Exception {
    // regular auth/token creation
}

@Override
protected void cleanup(ServletRequest request, ServletResponse response, Exception existing) throws ServletException, IOException {

    HttpServletResponse httpResponse = (HttpServletResponse)response;
    if ( null != existing ) {
        httpResponse.setContentType(MediaType.APPLICATION_JSON);
        httpResponse.getOutputStream().write(String.format("{\"error\":\"%s\"}", existing.getMessage()).getBytes());
        httpResponse.setStatus(Response.Status.FORBIDDEN.getStatusCode());
        existing = null; // prevent Shiro from tossing a ServletException
    }
    super.cleanup(request, httpResponse, existing);
}
}