[英]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.