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



我认为我对WebLogic的AuthenticationProviders有很高的理解,但我不知道如何将用户凭据传递给提供商。


我的理解

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

在浏览了Oracle关于AuthorizationProviders的文档之后,大部分内容似乎都很简单。AuthenticationProvider使用JAAS来执行登录。似乎AuthenticationProvider在内部管理LoginContext

我很难理解/找到的是WebLogic如何管理LoginContextCallbackHandler,它们最终被传递给LoginModule.initialize方法


形势

应用程序:

  • 在WebLogic 11g(10.3.6)上运行的Java web应用程序
  • 尝试使用用户名和密码进行身份验证,无需表单登录

当前,应用程序使用表单登录并通过"j_security_check"操作提交。有一个自定义的AuthenticationProviderLoginModule,用于处理登录并处理表单中提交的用户名和密码

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


我的目标

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

我想做以下之一:

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

我的问题

如何将标头凭据传递给LoginModule

  1. 是否有预定义的AuthenticationProvider可以从标头中提取用户名和密码?你能描述一下从请求到登录的流程吗
  2. 是否有某种方法可以访问AuthenticationProvider使用的CallbackHandlerLoginContext?通过这种方式,我可以自己将凭据传递给AuthenticationProvider
  3. WebLogic如何知道在哪里获取用户凭据,以及如何将它们绑定到特定的AuthenticationProvider

在这一过程中,我很可能错过了一些关键概念,所以请随时让我走上正确的道路。

谢谢!

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

身份验证提供商-JAAS如何使用WebLogic安全框架

JAAS身份验证的步骤3和4列为:

  1. WebLogicServer容器调用WebLogicSecurityFramework如果客户端回调处理程序包含身份验证信息,这会传递到WebLogic Security框架

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

这是让我失望的部分。我的大脑被一个CallbackHandler隧道式地传递给WebLogic身份验证信息。我没有注意到步骤末尾显示的注释:

注意

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

身份验证-方法摘要

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

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

这是一个旧线程,但我觉得可能值得添加一个与容器无关的选项,即调用httpRequest.login(用户名、密码)方法。

最新更新