我认为我对WebLogic的AuthenticationProviders
有很高的理解,但我不知道如何将用户凭据传递给提供商。
我的理解
在阅读JAAS时,我想我已经掌握了如何使用LoginContext
进行登录。LoginContext
从JAAS配置文件中获取LoginModule
和JAAS选项。通过定义某个CallbackHandler
的实例,可以传递用户凭据。在调用LoginContext.login()
之后,使用关联的LoginModule
执行登录。
在浏览了Oracle关于AuthorizationProviders
的文档之后,大部分内容似乎都很简单。AuthenticationProvider
使用JAAS来执行登录。似乎AuthenticationProvider
在内部管理LoginContext
。
我很难理解/找到的是WebLogic如何管理LoginContext
和CallbackHandler
,它们最终被传递给LoginModule.initialize
方法
形势
应用程序:
- 在WebLogic 11g(10.3.6)上运行的Java web应用程序
- 尝试使用用户名和密码进行身份验证,无需表单登录
当前,应用程序使用表单登录并通过"j_security_check"操作提交。有一个自定义的AuthenticationProvider
和LoginModule
,用于处理登录并处理表单中提交的用户名和密码
我假设WebLogic可以在内部处理"j_security_check"操作,并知道如何将表单输入字段映射到传递给自定义LoginModule
的CallbackHandler
。
我的目标
我正在尝试创建第二个登录过程,该过程涉及从HTTP请求标头中提取凭据(用户名/密码)。凭据当前是使用servlet过滤器提取的。无论如何,我想将这些凭据传递给已经用于表单登录的LoginModule
。
我想做以下之一:
- 直接从标头中获取凭据并将其传递给
AuthenticationProvider
(通过一些自定义的AuthenticationProvider
实现和/或配置) - 使用servlet过滤器提取标头凭据,并手动将其传递给
AuthenticationProvider
我的问题
如何将标头凭据传递给LoginModule
- 是否有预定义的
AuthenticationProvider
可以从标头中提取用户名和密码?你能描述一下从请求到登录的流程吗 - 是否有某种方法可以访问
AuthenticationProvider
使用的CallbackHandler
或LoginContext
?通过这种方式,我可以自己将凭据传递给AuthenticationProvider
- WebLogic如何知道在哪里获取用户凭据,以及如何将它们绑定到特定的
AuthenticationProvider
在这一过程中,我很可能错过了一些关键概念,所以请随时让我走上正确的道路。
谢谢!
我理解WebLogic的AuthenticationProviders
最大的障碍是理解如何传递凭据。似乎有太多的事情在幕后"自动"发生。我觉得我必须以某种方式访问WebLogic在后台操作的LoginContext
和/或CallbackHandler
。我走在了正确的轨道上,但错过了关于JAAS身份验证的一些重要内容。。。
身份验证提供商-JAAS如何使用WebLogic安全框架
JAAS身份验证的步骤3和4列为:
WebLogicServer容器调用WebLogicSecurityFramework如果客户端回调处理程序包含身份验证信息,这会传递到WebLogic Security框架。
对于每个配置的身份验证提供程序,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(用户名、密码)方法。