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

时间:2018-08-31 19:58:38

标签: java authentication web-applications weblogic jaas

我认为我对WebLogic的AuthenticationProviders有一个高水平的了解,但是我无法理解如何将用户凭据传递给提供程序。


我的理解

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

在查阅AuthorizationProviders上Oracle的文档之后,大多数内容似乎非常简单。 AuthenticationProvider利用JAAS执行登录。似乎AuthenticationProvider在内部管理LoginContext

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


情况

应用程序:

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

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

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


我的目标

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

我想执行以下一项操作:

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

我的问题

如何将标头凭据传递给AuthenticationProvider

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

我很可能在此过程中遗漏了一些关键概念,所以请随意将我提到的内容带入正确的轨道。

谢谢!

2 个答案:

答案 0 :(得分:1)

我对了解WebLogic AuthenticationProviders的最大困扰是在了解如何传递凭据。似乎有很多事情“自动地”发生在幕后。我觉得我不得不以某种方式访问​​WebLogic在后台操纵的LoginContext和/或CallbackHandler。我在正确的轨道上,但是错过了有关JAAS身份验证的重要信息...

Authentication Providers - How JAAS Works With the WebLogic Security Framework

JAAS认证的步骤3和4如下:

  
      
  1. WebLogic Server容器调用WebLogic安全框架。 如果有一个包含以下内容的客户端CallbackHandler   身份验证信息,此信息传递到WebLogic安全性中   框架

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

  4.   

这是让我失望的部分。我的头脑在CallbackHandler上传递了WebLogic身份验证信息。我无法接听步骤结尾处显示的注释:

  

注意

     

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

Authentication - Method Summary

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

对于我来说,我可以使用servlet过滤器从请求标头中选择凭证,将其传递给CallbackHandler,然后调用Authentication.login(CallbackHandler callbackHandler)以使用自定义{{1 }}。

答案 1 :(得分:0)

这是一个旧线程,但是我觉得值得添加的一个容器不可知选项是调用httpRequest.login(username,password)方法。