簡體   English   中英

Eclipse Scout-干凈的數據庫身份驗證

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM