2016-12-01 4 views
0

Eclipse Scout를 사용하여 데이터베이스 인증을 구현하려고합니다.Eclipse Scout - 데이터베이스 삭제 인증

저는 클라이언트 모듈에 DataSourceCredentialVerifier 클래스를 만들었습니다.이 모듈은 ICredentialVerifier 인터페이스를 구현합니다. 그런 다음 UiServletFilter 클래스의 init 메소드를 my verifier를 사용하도록 수정했습니다.

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이 나를 위해 인스턴스를 만들어야한다고 가정합니다. 내 IMySqlAuthService 인터페이스가 @ApplicationScoped 주석이있는 IService에서 확장되기 때문에 MySqlAuthService을 Bean으로 등록해야합니다.

MySqlAuthService@Bean 주석을 추가하면 동일한 예외가 발생합니다.

다음

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-Technical-Guide의 요약 정보입니다.

스카우트에는 주석이 내장되어 있습니다 (@TunnelToServer). 이 주석으로 표시된 인터페이스는 서버에서 호출됩니다. 서버 자체는이 주석을 무시합니다. 빈이 클라이언트 측에 등록되도록하려면이 주석이 필요합니다. (!)은이 Bean에 대한 인스턴스를 직접 만들 수 없으며 특정 제작자가 등록되어 호출을 서버에 위임하는 프록시를 만듭니다.

내 첫 번째 실수는 IMySqlAuthService@TunnelToServer으로 주석을 추가하지 않아서였습니다.

이 추가 후 아무 인스턴스도 없앴습니다. AssertionError.

그 후 내 코드가 HTTP 상태 코드 : 403 액세스가 금지되어 실행되었습니다.

내 코드가 올바른 스레드에서 실행되지 않았기 때문에 발생했습니다. 현재는 RunContext입니다.

 Subject subject = new Subject(); 
    subject.getPrincipals().add(new SimplePrincipal("system")); 
    subject.setReadOnly(); 
    RunContext runContext = RunContexts.copyCurrent().withSubject(subject); 

이제 하나의 코드가 결과를 반환하는지 여부 따라 runContext의 call() 또는 run() 방법을 사용할 수 있습니다 : 나는 DataSourceCredentialVerifierverify 방법이 코드 라인을 사용했다. 작업은 현재 스레드에서 실행됩니다. 즉, 호출자는 완료 될 때까지 차단됩니다.

구체적인 예 솔루션 :

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