【问题标题】:Use JASPIC auth module on WebSphere 8.5在 WebSphere 8.5 上使用 JASPIC auth 模块
【发布时间】:2015-02-25 12:10:00
【问题描述】:

我有一个在 GlassFish、WildFly 和 WebLogic 上运行良好的 JASPIC 身份验证模块。

现在我们有一个使用 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 并像所有其他服务器一样接受任何用户名?

【问题讨论】:

  • 迈克,这可能是个问题。您应该考虑在 IBM Support 中打开 PMR 来澄清这一点。

标签: java websphere websphere-8 jaspic


【解决方案1】:

归因于 WebSphere 8.5 的行为,WRT JASPIC CallerPrincipalCallback 的处理与 JASPIC 规范不兼容。

CallerPrincipalCallback(s) 必须能够支持用户注册表是 集成在 SAM 中,包括提供用户组成员资格。

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

HTH,

罗恩·蒙齐洛

【讨论】:

    【解决方案2】:

    一般来说,如果可能的话,我通常建议使用容器身份验证/授权,因为它已经由服务器基础设施提供,并且在大多数情况下就足够了。

    但是,如果您需要它,这里有一些提示。

    如果您想避免额外的检查,并允许对不在 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

    另见:

    【讨论】:

    • 非常感谢您的回答。仅供参考,JASPIC -is- 容器身份验证。我将尝试使用哈希表,但我讨厌在我的 SAM 中有 WebSphere 的特殊代码。为什么这里的 WebSphere 不完全兼容 EE 6?
    • Ps “而不是使用回调”有一点问题,因为同一个 SAM 必须用于多个服务器:(
    • @Gas 我不认为你最后的评论是完全正确的。 JASPIC 的全部目的是相同的代码适用于不同的供应商。 JASPIC 规范正是提供了这种保证,而 WebSphere 似乎没有正确地实现它。它必须能够以兼容的方式处理处理程序,并且通过需要替代方法它不会这样做。但是 JASPIC TCK 非常小,所以这个案例可能被遗漏了。 p.s.我是最初在 OP 中提到的 IBM 论坛上报告该问题的人,但我没有跟进。我的错。
    • @Gas 对不起,如果我没有说明我的情况。用户完全在我们自己的控制之下,并且不在一个共同的注册表中。您建议使用特定于 WebSphere 的自定义注册表,但 JASPIC 已经是用于容器的。我们不想为每个服务器实现特定的东西,而是使用一个在任何地方都可以使用的东西。我们的 JASPIC 模块适用于我们尝试过的所有兼容的 EE 6 服务器,除了 WebSphere。那么问题肯定出在 WebSphere 上吗?
    • @Gas 查看 JASPIC 规范负责人 Ron Monzillo 的回答。 WebSphere 在这里确实不符合规范。
    猜你喜欢
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多