我正在尝试使用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/
如何让我的示例使用我的服务?
答案 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