在WebSphere 8.5上使用JASPIC身份验证模块

4
我有一个在GlassFish,WildFly和WebLogic上运行非常好的JASPIC auth模块。
现在我们有一个使用WebSphere 8.5的新客户,我无法让auth模块在那里正常运行。
问题是WebSphere不接受auth模块放入CallerPrincipalCallback中的用户名。我们支持的其他服务器都只接受这个,但是WebSphere似乎认为需要执行一些额外的检查。
调查此问题后,我偶然发现了这个链接:https://www.ibm.com/developerworks/community/forums/html/topic?id=77777777-0000-0000-0000-000014937852 这恰好描述了我的问题,但没有给出解决方案。
我该如何说服WebSphere仅处理CallerPrincipalHandler并像其他所有服务器一样接受任何用户名?

1
Mike,这可能是一个问题。你应该考虑在IBM支持中心开启PMR以澄清这个问题。 - Gas
2个回答

5

WebSphere 8.5在处理JASPIC CallerPrincipalCallback时的行为与JASPIC规范不兼容。

CallerPrincipalCallback必须支持将用户注册表集成到SAM中的情况,包括提供用户组成员身份的目的。

对于基于密码验证的特殊情况,SAM可以调用容器提供的CallbackHandler来处理PasswordValidationCallback;此时,如果用户名和/或密码组合在与容器的CallbackHandler集成的用户注册表中不存在,则CallbackHandler会返回失败结果。在这种情况下,SAM会返回失败(或继续)认证结果,并且不会调用CallbackHandler来处理CallerPrincipalCallback。

希望有所帮助,

Ron Monzillo


1
一般情况下,如果可能的话,我通常建议使用容器身份验证/授权,因为它已由服务器基础架构提供,并且在大多数情况下足够。但是,如果在您的情况下需要,请参考以下提示。如果您希望避免额外的检查,并允许对不在WebSphere用户注册表中的用户进行身份验证,您必须创建完整的主题(这是固定用户简化),而不是使用回调函数。
public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject,
        Subject serviceSubject) throws AuthException {

   String uniqueid = "test";
   String username = "test";
   String password = "test";

   Hashtable hashtable = new Hashtable();
   hashtable.put(AttributeNameConstants.WSCREDENTIAL_UNIQUEID, uniqueid);
   hashtable.put(AttributeNameConstants.WSCREDENTIAL_SECURITYNAME, username);
   hashtable.put(AttributeNameConstants.WSCREDENTIAL_PASSWORD, password);
   List groups = new ArrayList();

   // if you want to use existing group uncomment this
   // com.ibm.websphere.security.UserRegistry reg = 
   //  (com.ibm.websphere.security.UserRegistry) ctx.lookup("UserRegistry");    
   // String groupID reg.getUniqueGroupId("testers");
   // groups.add(groupID); // for federated registry it returns cn=testers,o=defaultWIMFileBasedRealm


   // if you want to use fake groups just add them here, and provide correct binding file - see below. If you don't want to use groups just omit WSCREDENTIAL_GROUPS  
   groups.add("testers");

   hashtable.put(AttributeNameConstants.WSCREDENTIAL_GROUPS, groups); //optional 
   hashtable.put(AttributeNameConstants.WSCREDENTIAL_CACHE_KEY, "myCustomAttribute" + uniqueid);
   clientSubject.getPrivateCredentials().add(hashtable);

   return AuthStatus.SUCCESS;

}

我假设您想将这些用户映射到应用程序中的某些安全角色。您可以使用用户、组或特殊主体进行映射。您需要在您的application.xml中定义角色,如下所示:
<security-role>
    <role-name>user</role-name>
</security-role>

您需要绑定文件,因为无法通过控制台为不存在的用户/组执行绑定。创建 ibm-application-bnd.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<application-bnd xmlns="http://websphere.ibm.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-application-bnd_1_2.xsd"
version="1.2">

  <security-role name="user">
    <user name="test" access-id="user:defaultWIMFileBasedRealm/test"/>
    <group name="testers" access-id="group:defaultWIMFileBasedRealm/testers"/>
    <special-subject type="ALL_AUTHENTICATED_USERS" />
  </security-role>
</application-bnd>

我为各种映射提供了示例,使用适合您需求的映射:

  • user - 将命名用户映射到角色
  • group - 将组映射到角色
  • special-subject - 如果您希望任何经过身份验证的用户都拥有该角色。

重要提示:如果您想使用虚拟用户/组,则必须提供access-id属性;如果它们在注册表中,则只需提供name

另请参见:


1
非常感谢您的回答。顺便说一下,JASPIC是容器认证。我会尝试使用哈希表,但我不想在我的SAM中为WebSphere编写特殊代码。为什么WebSphere在这里不完全符合EE 6标准呢? - Mike Braun
2
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Mike Braun
3
@Gas,我认为你最后一条评论并不完全正确。 JASPIC 的全部目的是相同的代码可以适用于不同的供应商。JASPIC 规范确保了这一点,但是 WebSphere 似乎没有正确实现它。 它必须能够以兼容的方式处理处理程序,并且通过要求另一种方法来处理它,它不能这样做。但是 JASPIC TCK 很小,因此可能会忽略该情况。附言:我是最初在 IBM 论坛上报告此问题的人,但我没有跟进它。我的错。 - Arjan Tijms
1
@Gas,如果我没有表述清楚,请见谅。用户完全受我们自己的控制,不在公共注册表中。您建议采用WebSphere特定的自定义注册表,但JASPIC已经是容器的自定义注册表。我们不想为每个服务器实现特定的功能,而是使用适用于所有服务器的功能。我们的JASPIC模块在我们尝试过的每个兼容EE 6服务器上都可以工作,除了 WebSphere。那么问题肯定与WebSphere有关吧? - Mike Braun
1
@Gas 刚刚也尝试了,但是问题依旧(我尝试了 wlp-beta-javaee7-2015.4.0.0.zip)。我为它开发了一个空用户注册表,这样就可以工作了(很快会发布一篇博客文章),但这当然不是真正的可移植性,并且在Java EE 7示例项目中真的很麻烦。好消息是,我看到EE 7示例项目已经引起了你们其中一位同事的关注: https://github.com/javaee-samples/javaee7-samples/issues/263,所以我相信我们最终会解决这个问题 ;) 谢谢更新! - Arjan Tijms
显示剩余12条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接