如何使用自定义登录模块捕获响应状态Tomcat JaasRealm

时间:2018-09-06 15:12:23

标签: java tomcat java-8 jaas

我正在通过JaasRealm和自定义登录模块使用Tomcat CMA。在本文中,我将重写boolean LoginModule#login()方法。现在,每当请求进入Web应用程序上下文时,首先都会通过此登录方法对其进行身份验证。因此,此登录方法的返回类型为boolean

  @Override
    public boolean login() throws LoginException {

        Callback[] callbacks = new Callback[2];

因此,如果返回值为true,则它将继续完成进一步的请求;如果返回值为false,则它将返回401 Status。在某些情况下,当我返回值false时,我想返回401状态以外的其他状态。但是似乎对我来说这是不可能的。知道如何在loginModule返回false时发回修改后的状态作为响应。

1 个答案:

答案 0 :(得分:1)

您既不能在登录模块中也不能在JAASRealm中影响响应,如果身份验证成功,这些类将仅创建一个Principal,否则将为null,JAASRealm会吞噬每个异常。

因此,您应该

  • 扩展JAASRealm,并覆盖身份验证并抛出AccountExpiredException / FailedLoginException / etc。作为包装的未经检查的异常(自定义RuntimeException)
  • 扩展DigestAuthenticator类并重写doAuthenticate(或复制整个源,这肯定可以工作),在那里捕获您的自定义RuntimeException并使用response.sendError()将响应代码设置为所需的内容
  • 使用自定义JAASRealm类照常配置整个过程,并且CustomDigestAuthenticator应该为registered(我不知道有可能以一种不太全局的方式来做到这一点)

可以找到类似的主题here