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
我正在尝试使用 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