首页 > 解决方案 > 如何将用户凭据传递给 WebLogic 11g 身份验证提供程序?

问题描述

我想我对 WebLogic 有很高的了解AuthenticationProviders,但我不明白如何将用户凭据传递给提供者。


我的理解

在阅读 JAAS 时,我想我已经掌握了如何使用 aLoginContext来执行登录。从 JAAS 配置文件中LoginContext选择LoginModule和 JAAS 选项。通过定义 some 的实例CallbackHandler,您可以传递用户凭据。调用后LoginContext.login(),使用关联的LoginModule.

在浏览了 Oracle 的文档之后AuthorizationProviders,大部分内容看起来都非常简单。AnAuthenticationProvider利用 JAAS 执行登录。这似乎是AuthenticationProvider一个内部管理LoginContext

我很难掌握/发现的是 WebLogic 如何管理LoginContextCallbackHandler最终传递给LoginModule.initialize方法的。


情况

应用程序:

目前,应用程序使用表单登录并使用“j_security_check”操作提交。有一个自定义的AuthenticationProviderLoginModule它处理登录并处理表单中提交的用户名和密码。

我假设 WebLogic 可以在内部处理“j_security_check”操作,并且知道如何将表单输入字段映射到CallbackHandler传递给自定义LoginModule.


我的目标

我正在尝试创建第二个登录过程,该过程涉及从 HTTP 请求标头中提取凭据(用户名/密码)。当前使用 servlet 过滤器提取凭据。一种或另一种方式,我想将这些凭据传递给LoginModule已经用于表单登录的凭据。

我想做以下其中一项:

  1. 直接从标头中获取凭据并将它们传递给AuthenticationProvider(通过一些自定义AuthenticationProvider实现和/或配置)
  2. 使用 servlet 过滤器提取标头凭据并手动将它们传递给AuthenticationProvider.

我的问题

我该怎么做才能将标头凭据传递给LoginModule?

  1. 是否有AuthenticationProvider可以从标头中提取用户名和密码的预定义?你能描述一下从请求到登录的流程吗?
  2. 有什么方法可以访问CallbackHandlerLoginContext使用的AuthenticationProvider?这样我就可以将凭据传递给AuthenticationProvider我自己。
  3. WebLogic 如何知道从何处获取用户凭据以及如何将它们与特定的AuthenticationProvider.

我很可能在此过程中遗漏了一些关键概念,因此请随时将我提到的任何内容放在正确的轨道上。

谢谢!

标签: javaauthenticationweb-applicationsweblogicjaas

解决方案


我对理解 WebLogic 的最大障碍AuthenticationProviders是理解如何传递凭据。似乎有太多事情“自动”发生在幕后。我觉得我必须以某种方式访问​​一个LoginContext和/或CallbackHandler在后台操纵的 WebLogic。我走在正确的轨道上,但错过了一些关于 JAAS 身份验证的重要内容......

身份验证提供程序 - JAAS 如何与 WebLogic 安全框架协同工作

JAAS 身份验证的步骤 3 和 4 如下所示:

  1. WebLogic Server 容器调用 WebLogic 安全框架。如果存在包含身份验证信息的客户端 CallbackHandler,则会将其传递给 WebLogic 安全框架

  2. 对于每个配置的身份验证提供程序,WebLogic 安全框架使用传入的身份验证信息创建一个 CallbackHandler 。(这些是 WebLogic 安全框架在服务器端创建的内部 CallbackHandler,与客户端的 CallbackHandler 无关。)

这是让我失望的部分。我的思绪被CallbackHandler传递给 WebLogic 的身份验证信息。我没有看到步骤末尾显示的注释:

注意

对于完全在服务器端执行的身份验证,该过程将从步骤 3 开始,WebLogic Server 容器将在步骤 4 之前调用 weblogic.security.services.authentication.login 方法。

身份验证 - 方法摘要

你不知道吗...Authentication有四种login方法,每种方法都接受一个CallbackHandler

对于我的情况,我可以使用 servlet 过滤器从请求标头中挑选出凭据,将它们传递给 a CallbackHandler,然后调用Authentication.login(CallbackHandler callbackHandler)以使用 custom 成功登录LoginModule


推荐阅读