java - 如何将用户凭据传递给 WebLogic 11g 身份验证提供程序?
问题描述
我想我对 WebLogic 有很高的了解AuthenticationProviders
,但我不明白如何将用户凭据传递给提供者。
我的理解
在阅读 JAAS 时,我想我已经掌握了如何使用 aLoginContext
来执行登录。从 JAAS 配置文件中LoginContext
选择LoginModule
和 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”操作提交。有一个自定义的AuthenticationProvider
,LoginModule
它处理登录并处理表单中提交的用户名和密码。
我假设 WebLogic 可以在内部处理“j_security_check”操作,并且知道如何将表单输入字段映射到CallbackHandler
传递给自定义LoginModule
.
我的目标
我正在尝试创建第二个登录过程,该过程涉及从 HTTP 请求标头中提取凭据(用户名/密码)。当前使用 servlet 过滤器提取凭据。一种或另一种方式,我想将这些凭据传递给LoginModule
已经用于表单登录的凭据。
我想做以下其中一项:
- 直接从标头中获取凭据并将它们传递给
AuthenticationProvider
(通过一些自定义AuthenticationProvider
实现和/或配置) - 使用 servlet 过滤器提取标头凭据并手动将它们传递给
AuthenticationProvider
.
我的问题
我该怎么做才能将标头凭据传递给LoginModule
?
- 是否有
AuthenticationProvider
可以从标头中提取用户名和密码的预定义?你能描述一下从请求到登录的流程吗? - 有什么方法可以访问
CallbackHandler
或LoginContext
使用的AuthenticationProvider
?这样我就可以将凭据传递给AuthenticationProvider
我自己。 - WebLogic 如何知道从何处获取用户凭据以及如何将它们与特定的
AuthenticationProvider
.
我很可能在此过程中遗漏了一些关键概念,因此请随时将我提到的任何内容放在正确的轨道上。
谢谢!
解决方案
我对理解 WebLogic 的最大障碍AuthenticationProviders
是理解如何传递凭据。似乎有太多事情“自动”发生在幕后。我觉得我必须以某种方式访问一个LoginContext
和/或CallbackHandler
在后台操纵的 WebLogic。我走在正确的轨道上,但错过了一些关于 JAAS 身份验证的重要内容......
身份验证提供程序 - JAAS 如何与 WebLogic 安全框架协同工作
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 过滤器从请求标头中挑选出凭据,将它们传递给 a CallbackHandler
,然后调用Authentication.login(CallbackHandler callbackHandler)
以使用 custom 成功登录LoginModule
。
推荐阅读
- reactjs - 使用 React Router Switch 时取消 React 中的 Axios 请求
- c - C - 图表 - 如何添加根检查以查找关节点
- php - require(vendor/function.php):在 laravel 中打开流失败
- javascript - 从 ISO 日期减去天数
- docker - 主机目录已安装,但文件在 Docker 容器中不可见
- android - android studio 上 kotlin 中的“应用”错误
- c++ - 继承的类如何看到属于被继承类的数据成员的相同值
- node.js - 使用 NPM 在 Ubuntu 上安装 git-stats 时找不到模块错误
- node.js - 何时使用 node-postgres 包池与客户端?
- javascript - 我想隐藏所有具有 href 和一些特殊结构的 div 元素,而不是所有 div