Drools KnowledgeAgent и Guvnor: сбой аутентификации - PullRequest
3 голосов
/ 19 октября 2011

Этот действительно сводит меня с ума.

У меня есть Guvnor внутри JBoss AS (подробнее о версиях позже). Я отредактировал файл component.xml, чтобы включить аутентификацию (в JAAS у меня настроены только пользователи и пароли) и разрешение на основе ролей. У меня есть пользователь 'admin' с полными привилегиями и пользователь 'agent' с правами только для чтения. Пока все хорошо, в Guvnor я могу видеть пользователей и соответствующие привилегии, из браузеров я могу войти в систему с пользователем 'admin', чтобы загрузить правила и тому подобное, и я могу загрузить changeset.xmls и двоичные файлы с пользователем 'agent'.

Теперь из приложения Java я настроил агент знаний. В UrlResource я установил имя пользователя («агент») и пароль. Набор изменений загружается просто отлично, однако файл changeset.xml ссылается на другие ресурсы (например, PKG). Загрузка их не удалась (HTTP 401). Похоже, Drools забывает о моих полномочиях в пути.

Редактирование файла changeset.xml вручную и добавление enableBasicAuthentcation, имени пользователя и пароля - все работает нормально. Но на самом деле это не тот путь.

Я искал какое-либо решение: а) увидеть некоторую панель параметров в Guvnor, чтобы я мог настроить, что нужно встраивать в changeset.xml автоматически при развертывании пакетов б) найти способ, чтобы учетные данные передавались в мой проект Java, так что все работает.

Теперь я попробовал Drools 5.1.1, 5.2.FINAL, 5.3.CR1, просмотрел документацию этих версий. Единственное замечание, которое я нашел в документах 5.3: «Идентификатор пользователя и пароль в наборе изменений должны соответствовать требованиям Authenticator, настроенным в компонентах.xml». - спасибо, я понимаю, но как это сделать? «Пожалуйста, обратитесь к разделу« Безопасность - Аутентификация и базовый доступ »в« Руководстве по администрированию »для получения более подробной информации». Я сделал и ничего не нашел.

Так на самом деле, что мне не хватает или что я делаю не так? Неужели единственный способ решить эту проблему - не использовать аутентификацию? Или редактировать changeset.xmls вручную при каждом изменении?

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 14 сентября 2012

Здесь опубликован обходной путь

[JBRULES-3465]

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

с ограничением, которое работает только для одного имени пользователя на агента

2 голосов
/ 20 марта 2012

Я уже получил эту ошибку при использовании 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"));

И это все!

...