通过Java API检索Websphere Liberty Profile和J2C AuthData

时间:2014-06-16 19:39:09

标签: jaas websphere-8 websphere-liberty jca

在完整版的Websphere中,您可以定义JAAS身份验证条目。 这些条目具有唯一的ID,用户名和密码。通常这些绑定到WAS中的其他配置条目,例如DataSource配置。

但有时您需要通过API直接从应用程序代码访问J2C记录。 这里有几篇帖子解释了如何在WAS中做到这一点。 通常你做的是:

LoginContext loginContext = new LoginContext("DefaultPrincipalMapping", callbackHandler);
loginContext.login();

它确实通过JCA API在WAS中起作用,但在Websphere Liberty Profile中却没有。 有没有办法在Websphere Liberty Profile中访问J2C AuthData? 为此目的在server.xml中设置J2C所需的最低配置是什么?

我们有类似的东西:

<featureManager>
    <feature>appSecurity-2.0</feature>
</featureManager>
<authData id="someAppCredentials" user="someUser" password="some Password"/>
<jaasLoginContextEntry id="DefaultPrincipalMapping" name="DefaultPrincipalMapping" loginModuleRef="userNameAndPassword"/>

但是由于WLP抛出,显然还不够:javax.security.auth.login.LoginException:没有为DefaultPrincipalMapping配置LoginModule 如果你尝试做loginContext.login()。

2 个答案:

答案 0 :(得分:0)

目前,Liberty配置文件中不支持DefaultPrincipalMapping。应用程序没有API可以调用并获取此信息。这可以在将来的版本中考虑。

答案 1 :(得分:0)

从8.5.5.9版开始,似乎已添加此功能。

有关详细信息,请参阅:Developing a programmatic login for obtaining authentication data

您需要server.xml中的以下功能:

<featureManager>
   <feature>appSecurity-2.0</feature>
   <feature>passwordUtilities-1.0</feature>
   <feature>jca-1.7</feature>
</featureManager>

然后定义你的别名:

<authData id="myAuthData" user="myUser" password="myPassword"/> <!-- password can also be encoded -->

然后在代码中访问它:

HashMap map = new HashMap();
map.put(com.ibm.wsspi.security.auth.callback.Constants.MAPPING_ALIAS, "myAuthData"); // Replace value with your alias.
CallbackHandler callbackHandler = new com.ibm.wsspi.security.auth.callback.WSMappingCallbackHandler(map, null);
LoginContext loginContext = new LoginContext("DefaultPrincipalMapping", callbackHandler);
loginContext.login();
Subject subject = loginContext.getSubject();
Set<javax.resource.spi.security.PasswordCredential> creds = subject.getPrivateCredentials(javax.resource.spi.security.PasswordCredential.class);
PasswordCredential passwordCredential = creds.iterator().next();

String userName = passwordCredential.getUserName();
char[] password = passwordCredential.getPassword();
// Do something with the userName and password.