Drools KnowledgeAgent和Guvnor:身份验证失败

时间:2011-10-19 10:38:47

标签: authentication drools

这个让我疯狂。

我在JBoss AS中有一个Guvnor(稍后会有更多版本)。我编辑了components.xml以启用身份验证(使用JAAS,我已经设置了用户和密码)和基于角色的权限。我有一个拥有完全权限的'admin'用户和一个具有只读权限的'agent'用户。到目前为止一切顺利,在Guvnor我可以看到用户和适当的权限,我可以使用'admin'用户登录浏览器上传规则等,我可以使用'agent'用户下载changeset.xmls和二进制文件。 / p>

现在,我从Java应用程序中设置了一个知识代理。在UrlResource中,我设置了用户名('agent')和密码。变更集下载得很好,但是,changeset.xml引用其他资源(例如PKG)。下载它们失败(HTTP 401)。看起来像Drools忘记了我的凭证。

手动编辑changeset.xml,并添加enableBasicAuthentcation,用户名和密码 - 它工作正常。但这真的不是要走的路。

我一直在寻找任何一种解决方案:a)在Guvnor中查看一些选项面板,以便我可以在部署包时自动设置嵌入在changeset.xml中的内容b)找到一种方法,因此凭据在我的Java项目所以一切正常。

现在,我尝试了Drools 5.1.1,5.2.FINAL,5.3.CR1,查看了这些版本的文档。我发现的唯一评论是在5.3文档中:“更改集中的用户ID和密码应该与components.xml中配置的Authenticator的要求一致。” - 谢谢,我明白了,但是怎么做? “有关详细信息,请参阅”管理指南“的”安全 - 身份验证和基本访问“部分。”我做了什么都没发现。

真的,我错过了什么,或者我做错了什么?真的解决这个问题的唯一方法是不使用身份验证吗?或者在每次更改时手动编辑changeset.xmls?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

我在使用KnowledgeAgent时已经遇到此错误,似乎Url资源设置不正确(我说的是5.1.1版本) 作为一种解决方法,您可以设置一个新的代理事件监听器,因此强制使用用户名/密码(这是我的例子中的内部类):

    private static final class AuthKnowledgeAgentEventListener extends
        DefaultKnowledgeAgentEventListener {
    private final String username;

    private final String password;

    private AuthKnowledgeAgentEventListener(String username, String password) {
        this.username = username;
        this.password = password;
    }

    @Override
    public void beforeChangeSetApplied(BeforeChangeSetAppliedEvent event) {
        // Obliged to do this to get UrlResources done correctly...
        ChangeSet changeSet = event.getChangeSet();
        for (Resource res : changeSet.getResourcesAdded()) {
            if (res instanceof UrlResource) {
                setupUrlResource((UrlResource) res);
            }
        }
        for (Resource res : changeSet.getResourcesModified()) {
            if (res instanceof UrlResource) {
                setupUrlResource((UrlResource) res);
            }
        }
                        // maybe this is needed for deleted resources, i didn't check

    }

    private void setupUrlResource(UrlResource resource) {
        if (starter.droolsAuthenticationEnabled) {
            resource.setBasicAuthentication("enabled");
            resource.setUsername(username);
            resource.setPassword(password);
        }
    }
}

然后将此事件侦听器设置为您的代理:

agent.addEventListener(new AuthKnowledgeAgentEventListener("myusername","mypassword"));

就是这样!

答案 1 :(得分:2)

这里有一个解决方法

[JBRULES-3465]

https://issues.jboss.org/browse/JBRULES-3465

使用约束它只适用于每个代理的一个用户名