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

时间:2016-12-01 15:38:45

标签: java eclipse-scout

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

为此,我在 client 模块中创建了一个类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应该注册为Bean,因为我的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/

如何让我的示例使用我的服务?

1 个答案:

答案 0 :(得分:0)

以下是有关Eclipse Scout原则重要说明的工作解决方案。

源代码是Eclipse-Scout-Technical-Guide的摘要信息。

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

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

在此添加之后,我摆脱了无实例AssertionError

之后,我的代码遇到了HTTP状态代码:403禁止访问。

这是因为我的代码没有在正确的Thread中运行。那是当前的RunContext。我必须在verify的{​​{1}}方法中使用这行代码:

DataSourceCredentialVerifier

现在可以使用runContext的 Subject subject = new Subject(); subject.getPrincipals().add(new SimplePrincipal("system")); subject.setReadOnly(); RunContext runContext = RunContexts.copyCurrent().withSubject(subject); 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. 的更多信息,请参阅此处: https://eclipsescout.github.io/6.0/technical-guide.html#runcontext