当前位置: 首页 > 知识库问答 >
问题:

WebSphere Liberty中jaas定制登录模块的类加载

马浩淼
2023-03-14

更新:关于以下问题的一些上下文。我的目标是处理用户的请求,他们为每个请求提供一个Kafka主题。我使用部署在Bluemix上的MessageHub作为Kafka提供者。请求将传递代理URL、主题名称、用户名、密码和API密钥。Bluemix上的MessageHub需要JAAS身份验证,并提供具有不同LoginModule实现的登录模块。一些基于CallbackHandler,其他基于CredentialProviders。

我选择了在< code > com . IBM . message hub . log in . multiuserloginmodule 中实现的那个。使用该模块,我只需提供一个自定义凭据提供程序,如:

KafkaClient {
com.ibm.messagehub.login.MultiUserLoginModule required
credentialProvider="myApp.CustomCredentialProvider";
};

挑战在于类装入器,以及自定义凭据提供程序如何在运行时从传递给多用户登录模块的请求中获取用户名/密码。我必须使用什么配置才能使其正常工作?

详细信息:我有一个在WebSphere Liberty 8.5.5中运行的Web应用程序,并希望使用第三方服务进行身份验证。该第三方服务实现了一个带有凭据提供程序的JAAS LoginModule。我的Web应用程序使用CustomCreentalProvider扩展了凭据提供程序以传递凭据。

我不明白的是类加载应该如何工作。我的server.xml定义:

web应用程序

 <webApplication id="streaming-service" location="streaming-service.war" name="streaming-service"/>

第三方登录模块

<jaasLoginModule className="com.ibm.messagehub.login.MultiUserLoginModule" controlFlag="REQUIRED" id="KafkaClient" libraryRef="messageHubLoginLib">
<options credentialProvider="myApp.CustomCredentialProvider" serviceName="kafka"/>
</jaasLoginModule>

实现第三方登录模块的库

   <library id="messageHubLoginLib">
    <fileset dir="${server.output.dir}" includes="messagehub.login-1.0.0.jar"/>
</library>

登录上下文

 <jaasLoginContextEntry id="KafkaClient" loginModuleRef="KafkaClient" name="KafkaClient"/>

上述配置的结果是我的CustomCredentialProvider出现ClassNotFoundException:

Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: myApp.CustomCredentialProvider
at com.ibm.messagehub.login.MultiUserLoginModule$MultiUserCallbackHandler.<clinit>(MultiUserLoginModule.java:80)

如何更改第三方JAAS登录模块的配置才能找到<code>myApp。CustomCredentialProvider在我的流服务web应用程序中实现?

注意:我已经尝试生成一个streaming-service.jar并将其直接添加到< code>messageHubLoginLib中。这解决了ClassNotFoundException,但是CustomCredentialProvider类完全是在我运行的web应用程序的上下文之外加载的,并且仍然不允许我访问我的凭据。

共有3个答案

戚晨
2023-03-14

能否将MultiUserLoginModule和CustomCredentialProvider jar文件放在$ { server . config . dir }/lib/global目录中,并将libraryRef指向server.xml文件中的全局目录,如下所示:

  <jaasLoginModule className="com.ibm.messagehub.login.MultiUserLoginModule" controlFlag="REQUIRED" id="KafkaClient" libraryRef="global">
    <options credentialProvider="myApp.CustomCredentialProvider" serviceName="kafka"/>
    </jaasLoginModule>
姜磊
2023-03-14

生成一个流服务.jar并将其直接添加到messageHubLoginLib应该是正确的方法。在这种情况下,您有一个可在 JAAS 登录模块和 Web 应用程序之间共享的 jar 文件。

但是,您说"CustomCreentalProvider类完全在我正在运行的Web应用程序的上下文之外加载,并且仍然不允许我访问我的凭据"。这听起来像是您试图将凭据存储在CustomCreentalProvider类中,以便在登录模块和Web应用程序之间使用。

CustomCredentialProvider类应该独立于登录模块和web应用程序。当请求进来并试图访问web应用程序时,服务器触发登录模块进行认证。如果通过,将成功访问web应用程序。

我没看到你发布。可能你缺少以下配置?

<jaasLoginContextEntry id="system.WEB_INBOUND" name="system.WEB_INBOUND" loginModuleRef="KafkaClient,hashtable,certificate,token" />
锺离霖
2023-03-14

使用单独的streaming-service.jar,您就快成功了。

  1. 识别登录模块需要可见的类(来自应用程序
  2. 将所有这些类放入messageHubLoginLib(例如,在单独的流服务.jar中)
  3. 从应用程序中删除这些类
  4. 使用类加载器子元素配置应用程序,该子元素使用commonLibraryRef属性引用登录模块库:
<webApplication id="streaming-service" location="streaming-service.war" name="streaming-service">
    <classloader commonLibraryRef="messageHubLoginLib" />
</webApplication>
 类似资料:
  • 有人可以使用jaas登录模块吗。我在看医生 我想是这些登录模块可以1.与OS用户进行身份验证2.提供该用户的组。 基本上我想通过操作系统进行身份验证。输入用户名和密码 我想用windows进行身份验证 我不想做LDAP认证只做os认证。 对于windows,有华夫饼干库可用。但我无法在使用64位机器时进行身份验证。在32位上运行良好。 对于linux,有jpam,但它不提供组。它只会检查用户名、密

  • 我正在尝试开发一个定制的JAAS登录模块,它使用一个令牌并从不同的来源获取用户数据。它应该作为wildfly 8.2.1 final的身份验证领域。我有一个测试servlet,我想在其中进行身份验证,以便检查注入EJB的允许角色。 这个网站的测试:http://www.radcortez.com/custom-principal-and-loginmodule-for-wildfly/事实上,我甚

  • 问题内容: 与使用控制台脚本保护的Kafka通信时出现问题。Kafka受保护,监听器受保护,机制由。 我做了什么:我尝试使用kafka脚本之一列出一些数据: 但是我明白了 命令失败,这是可以理解的,因为它由sasl保护。 因此,我尝试了如何向该命令添加客户端用户名/密码。首先,我尝试运行脚本,我曾经添加必要的文件。我很快发现我无法直接添加文件,我需要使用文件,所以我做到了。 我的属性文件(请记住,

  • 我创建了一个包含两种登录机制的项目: > < li> 第一个是使用简单登录页面的第一个认证机制(使用函数< code>findUser从数据库中获取用户(如果存在)) 第二种认证机制是JAAS提供的登录机制(j_security_check) 基本上,我试图实现这个目标:当用户成功进行身份验证(在第一个登录页面中)时,他应该能够跳过第二页登录(由JAAS提供),而不必在登录表单中重新输入他的用户名

  • 我正在尝试使用Java运行我的Kafka Streams应用程序,并以K,V对的形式将合流凭证作为环境变量传递。 但是我面临着一个错误的问题- 下面是我如何设置Kafka属性的- 下面是我如何传递环境变量的- 但是如果我直接在properties对象中硬编码Creds字符串,比如-

  • 尝试在连接到Kafka时使用kerberos身份验证时遇到问题。使用scala和my看起来像这样。