Eclipse Scout - 清理数据库身份验证

Eclipse Scout - Clean Database authentication

我正在尝试使用 Eclipse Scout 实现数据库身份验证。

为此,我在 client 模块中创建了一个 class DataSourceCredentialVerifier,它实现了 ICredentialVerifier 接口。然后我修改了 UiServletFilter class 的 init 方法来使用我的验证器。

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;
}

我还没有实现任何身份验证逻辑。我现在的任务是建立一个干净的数据库连接。

为此,我在 shared 模块中创建了以下 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 应该注册为一个 Bean,因为我的 IMySqlAuthService 接口从 IService 扩展而来,后者具有 @ApplicationScoped 注释。

@Bean 注释添加到 MySqlAuthService 会导致相同的异常。

这里有一些关于 BeanManager 和注释的信息: https://eclipsescout.github.io/6.0/technical-guide.html#sec-bean.manager

这是另一种不同的方法s.o。试过了,但感觉不对: https://www.eclipse.org/forums/index.php/t/1079741/

如何让我的示例与我的服务一起工作?

这是工作解决方案,其中包含对 Eclipse Scout 原则的重要解释。

来源是 Eclipse-Scout-Technical-Guide 的总结信息。

在 Scout 中有一个内置注释:@TunnelToServer。在服务器上调用标有此注释的接口。服务器本身会忽略此注释。 为了实现在客户端注册一个 bean,这个注解是必需的。平台 不能 (!) 直接为这些 bean 创建一个实例,一个特定的生产者被注册,它创建一个代理来委托对服务器的调用。

我的第一个明显错误是我没有用 @TunnelToServer 注释 IMySqlAuthService

添加之后,我去掉了 no 实例 AssertionError

之后我的代码 运行 进入 HTTP 状态代码:403 禁止访问。

发生这种情况是因为我的代码没有 运行 在正确的线程中。那就是现在的RunContext。我不得不在 DataSourceCredentialVerifier:

verify 方法中使用这行代码
     Subject subject = new Subject();
     subject.getPrincipals().add(new SimplePrincipal("system"));
     subject.setReadOnly();
     RunContext runContext = RunContexts.copyCurrent().withSubject(subject);

现在可以使用运行Context 的call()run() 方法,这取决于代码returns 是否有结果。该操作在 current 线程中为 运行,这意味着调用者将被阻塞直到完成。

具体示例解决方案:

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