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

问题描述 投票:0回答:1

我正在使用带有自定义登录模块的JaasRealm的Tomcat CMA。在这里,我压倒了boolean LoginModule#login()方法。现在,只要请求进入Web应用程序上下文,首先它将通过此​​登录方法进行身份验证。因为,这个登录方法有boolean返回类型

  @Override
    public boolean login() throws LoginException {

        Callback[] callbacks = new Callback[2];

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

java tomcat java-8 jaas
1个回答
1
投票

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

所以,为了做到这一点,你应该

  • 扩展JAASRealm,并覆盖authenticate并抛出AccountExpiredException / FailedLoginException / etc. as wrapped unchecked exception(自定义RuntimeException)
  • 扩展DigestAuthenticator类并覆盖doAuthenticate(或复制整个源代码,这肯定有效),捕获你的自定义RuntimeExceptions并使用response.sendError()将响应代码设置为你想要的
  • 像往常一样使用自定义JAASRealm类来配置整个事情,而CustomDigestAuthenticator应该是registered(我不知道可以以更少的全局方式执行)

类似的线程可以找到here

© www.soinside.com 2019 - 2024. All rights reserved.