2016-12-01 153 views
0

我想用Eclipse Scout实现数据库认证。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接口从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/

我怎样才能让我的例子与我的服务一起工作?

回答

0

以下是对Eclipse Scout原理进行重要说明的工作解决方案。

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

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

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

此后,我摆脱了没有实例AssertionError

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

发生这种情况是因为我的代码没有在正确的线程中运行。那是当前的RunContext。我不得不使用这个代码行我verify方法DataSourceCredentialVerifier的:

 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://eclipsescout.github.io/6.0/technical-guide.html#runcontext