2016-12-01 150 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