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