2011-10-19 40 views
3

這是一個真正讓我瘋狂的問題。我在JBoss AS內部有一個Guvnor(稍後版本更多)。我編輯了components.xml以啓用身份驗證(使用JAAS,我的用戶和密碼設置得很好)以及基於角色的權限。我有一個具有完全權限的'admin'用戶和一個'只有'只讀權限的'agent'用戶。到目前爲止,在Guvnor中我可以看到用戶和適當的特權,從瀏覽器我可以用'admin'用戶登錄來上傳規則等,我可以用'agent'用戶下載changeset.xml和二進制文件。Drools KnowledgeAgent和Guvnor:身份驗證失敗

現在,我從一個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.xml?

任何幫助將不勝感激。

回答

2

我在使用KnowledgeAgent的時候已經有了這個錯誤,好像Url資源設置不正確(我正在談論5.1.1版本) 作爲一個解決方法,您可以設置一個新的Agent Event Listener,用戶名/密碼的這種方式(它是一個內部類在我爲例):

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

我究竟試過你的建議的約束,但不幸的是,這隻能幫助獲取changeset.xml,但之後,代理不夠聰明,無法重用爲變更集文件中的資源集提供的憑據。 – Kjellski

+0

什麼是您的測試案例?因爲此代碼的目標是在下載之前更新changeset.xml中的所有url資源。您是否按照以下順序設置了這些內容: - 您與聽衆設置了代理 - 使用用戶名和密碼設置changeSet Url資源 - 應用更改集 這樣,它對我來說非常合適 – Steeve