猿问

如何将用户凭据传递给 WebLogic 11g 身份验证提供程序?

我想我对 WebLogic 的AuthenticationProviders.


我的理解

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

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

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


情况

该应用程序:

  • 在 WebLogic 11g (10.3.6) 上运行的 Java Web 应用程序。

  • 尝试使用用户名和密码进行身份验证,而无需表单登录。

目前,该应用程序使用表单登录并使用“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

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

谢谢!


慕无忌1623718
浏览 151回答 2
2回答

慕斯王

我理解 WebLogic 的最大障碍AuthenticationProviders是理解如何传递凭据。似乎有太多事情在幕后“自动”发生。我觉得我必须以某种方式访问一个LoginContext和/或CallbackHandler在后台操作的 WebLogic。我在正确的轨道上,但错过了一些关于 JAAS 身份验证的重要内容......JAAS 身份验证的第 3 步和第 4 步如下所示:WebLogic Server 容器调用 WebLogic 安全框架。如果存在包含身份验证信息的客户端 CallbackHandler,则会将其传递到 WebLogic 安全框架中。对于每个配置的身份验证提供程序,WebLogic 安全框架使用传入的身份验证信息创建一个 CallbackHandler 。(这些是由 WebLogic 安全框架在服务器端创建的内部 CallbackHandler,与客户端的 CallbackHandler 无关。)这是让我失望的部分。我的思绪被CallbackHandler传递到 WebLogic 的身份验证信息上。我没能听懂步骤末尾显示的注释:注意:对于完全在服务器端执行的身份验证,该过程将从步骤 3 开始,WebLogic Server 容器将在步骤 4 之前调用 weblogic.security.services.authentication.login 方法。你难道不知道吗……Authentication有四种login方法,每一种都接受一个CallbackHandler!对于我的情况,我可以使用 servlet 过滤器从请求标头中挑选凭据,将它们传递给CallbackHandler,然后调用Authentication.login(CallbackHandler callbackHandler)以使用自定义LoginModule.
随时随地看视频慕课网APP

相关分类

Java
我要回答