繁体   English   中英

Eclipse Scout-干净的数据库身份验证

[英]Eclipse Scout - Clean Database authentication

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

为此,我在客户端模块中创建了一个DataSourceCredentialVerifier类,该类实现了ICredentialVerifier接口。 然后,我修改了UiServletFilter类的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;
}

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

为此,我在共享模块中创建了以下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接口是从具有@ApplicationScoped批注的IService扩展的。

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

这里是有关BeanManager和注释的一些信息: https : BeanManager

这是尝试过的另一种不同方法,但感觉不正确: https//www.eclipse.org/forums/index.php/t/1079741/

我怎样才能使我的榜样与我的服务一起工作?

这是带有Eclipse Scout原理的重要说明的工作解决方案。

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

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

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

添加完之后,我摆脱了no instance AssertionError

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

发生这种情况是因为我的代码未在正确的线程中运行。 那就是当前的RunContext 我必须在DataSourceCredentialVerifier verify方法中使用以下代码行:

     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 : RunContext

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM