2016-12-01 2 views
0

Я пытаюсь реализовать аутентификацию базы данных с помощью Scout Eclipse.Eclipse Scout - Чистая проверка подлинности базы данных

Для этого я создал класс DataSourceCredentialVerifier в модуле , который реализует интерфейс ICredentialVerifier. Затем я применил метод init класса UiServletFilter для использования моего верификатора.

public class DataSourceCredentialVerifier implements ICredentialVerifier { 

private static final Logger LOG = LoggerFactory.getLogger(DataSourceCredentialVerifier.class); 

@Override 
public int verify(String username, char[] password) throws IOException { 
    Object queryResult[][] = BEANS.get(IMySqlAuthService.class).load(); 


    return AUTH_OK; 
} 

Я еще не реализовал логики аутентификации. Теперь моя задача - установить соединение с чистой базой данных.

Для этого я создал в следующие interface совместно модуль:

public interface IMySqlAuthService extends IService { 

    Object[][] load(); 
} 

Реализация находится в сервера модуля:

public class MySqlAuthService implements IMySqlAuthService { 

     @Override 
     public Object[][] load() { 
      String sql = "select username, password from users "; 
      Object[][] queryResult = SQL.select(sql, null, null);  
      return queryResult; 
     } 
    } 

Во-первых, я хочу увидеть, если есть есть хотя бы что-то в запросе, но я получаю AssertionException здесь:

Object queryResult[][] = BEANS.get(IMySqlAuthService.class).load(); 

org.eclipse.scout.rt.platform.util.Assertions$AssertionException: Assertion error: no instance found for query: interface org.eclipse.scout.app.shared.services.IMySqlAuthService 
at org.eclipse.scout.rt.platform.util.Assertions.fail(Assertions.java:580) 
at org.eclipse.scout.rt.platform.util.Assertions.assertNotNull(Assertions.java:87) 
at org.eclipse.scout.rt.platform.BEANS.get(BEANS.java:41) 

Я не получаю экземпляр моей реализации MySqlAuthService. Я предполагаю, что BeanManager должен был создать экземпляр для меня. MySqlAuthService должен быть зарегистрирован как Боб, так как мой интерфейс IMySqlAuthService простирается от IService, который содержит аннотацию @ApplicationScoped.

Добавление аннотации @Bean к MySqlAuthService приводит к тому же исключению.

Вот некоторая информация о BeanManager и аннотации: https://eclipsescout.github.io/6.0/technical-guide.html#sec-bean.manager

Вот еще один другой подход С.О. попробовал, но это не совсем правильно: https://www.eclipse.org/forums/index.php/t/1079741/

Как я могу получить свой пример для работы с моим сервисом?

ответ

0

Это рабочее решение с важными объяснениями принципов Eclipse Scout.

Источник обобщенной информации Технического руководства Eclipse-Scout.

В Развете есть встроенная аннотация: @TunnelToServer. Интерфейсы, помеченные этой аннотацией, вызываются на сервере. Сам сервер игнорирует эту аннотацию. Для того, чтобы компонент был зарегистрирован на стороне клиента, требуется аннотация. Платформа не может (!) Напрямую создать экземпляр для этих компонентов, зарегистрирован конкретный производитель, который создает прокси-сервер, который делегирует вызов серверу.

Моя первая явная ошибка заключалась в том, что я не аннотировал IMySqlAuthService с @TunnelToServer.

После этого добавления я избавился от примера AssertionError.

После этого мой код запустился в код состояния HTTP: 403 запрещен доступ.

Это произошло потому, что мой код не работал в правильной теме. Это текущий RunContext. Я должен был использовать эти строки кода в моем verify способе DataSourceCredentialVerifier:

 Subject subject = new Subject(); 
    subject.getPrincipals().add(new SimplePrincipal("system")); 
    subject.setReadOnly(); 
    RunContext runContext = RunContexts.copyCurrent().withSubject(subject); 

Теперь можно использовать runContext в call() или run() метод, в зависимости от того, возвращает ли код результата. Действие запускается в потоке , что означает, что вызывающий объект заблокирован до завершения.

Конкретный пример решения:

Object[][] result = runContext.call(new Callable<Object[][]>() { 

    @Override 
    public Object[][] call() throws Exception { 
     return BEANS.get(IMySqlAuthService.class).load(); 
    } 

}); 

//TODO implement authentication logic. 

Для получения дополнительной информации о RunContext смотрите здесь: https://eclipsescout.github.io/6.0/technical-guide.html#runcontext

Смежные вопросы