我需要在 Liberty 中实现 JAAS LoginModule。
我已经能够实现和配置(执行 login() 和 commit() 方法并返回 true)自定义模块,但它仍然不起作用(我仍然被重定向到登录页面,就好像容器一样并不真正认为用户已通过身份验证)。
基于我在 IBM documentation 上读到的内容我很确定我需要在“login() 方法”中做一些事情,我只是不知道什么。 我见过一些将事物添加到主题或“sharedState”映射中的示例,但我似乎无法准确地弄清楚我的代码需要什么。
因此,我们将不胜感激一些有关如何将用户/组/角色传递回容器的代码示例。
我已经取得了一些进展,现在身份验证可以工作,但授权不行。
我已将此代码添加到 login() 方法中:
java.util.Hashtable<String, Object> customProperties =
(java.util.Hashtable<String, Object>) sharedState.
get(AttributeNameConstants.WSCREDENTIAL_PROPERTIES_KEY);
if (customProperties == null) {
customProperties = new java.util.Hashtable<String, Object>();
}
customProperties.put(AttributeNameConstants.WSCREDENTIAL_UNIQUEID, username);
customProperties.put(AttributeNameConstants.WSCREDENTIAL_SECURITYNAME, username);
((Map<String, Object>)sharedState).put(AttributeNameConstants.WSCREDENTIAL_PROPERTIES_KEY,
customProperties);
此后一切正常,但前提是我在 server.xml 中使用以下内容:
<application-bnd>
<security-role name="adminrole">
<special-subject type="ALL_AUTHENTICATED_USERS" />
</security-role>
</application-bnd>
因此,所有经过身份验证的用户都具有访问我的应用程序所需的角色。
但是,如果我尝试用用户或组替换特殊主题,则会收到错误消息:
CWWKS9104A: Authorization failed for user userXXX:defaultRealm while invoking CustomLoginTest on /. The user is not granted access to any of the required roles: [adminrole].
因此,login() 方法必须返回其他内容(也许我还需要在主题中设置一些内容)。 将用户组列表添加到sharedState映射也不起作用:
customProperties.put(AttributeNameConstants.WSCREDENTIAL_GROUPS, groups);
最佳答案
需要其他默认登录模块来创建用于身份验证的 WebSphere 凭证。查看此文档以了解如何配置 JAAS 自定义登录模块。 https://www-01.ibm.com/support/knowledgecenter/SSEQTP_8.5.5/com.ibm.websphere.wlp.doc/ae/twlp_sec_jaas.html?cp=SSEQTP_8.5.5&lang=en 您的自定义 JAAS 登录模块可以使用共享状态或主题中的 HashMap 将用户信息传递到其他默认登录模块。
关于jakarta-ee - JAAS LoginModule 在 Websphere Liberty 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35334879/