2013-05-23 2 views
0

Restlet 2.1.2를 사용 중이고 요청한 텍스트가 null 인 대표 텍스트가 비정상적입니다. 포럼을 살펴본 결과 엔티티가 일시적이며 올바르게 캐싱되지 않으면 파손될 것이라고 읽었지만 보안을 제공하는 경비원은 알고있는 것처럼 엔티티에 손을 대지 않습니다. 좀 더 흥미롭게도 사용자가 인증받을 수 있는지를 확인하는 하나의 라우트/인증에 대해 엔티티 텍스트 인 JSON 객체를 얻을 수 있습니다. 그러나/account/create 코드가 실행될 때 @Post ("json : json")를 사용하여 두 요청을 모두 게시하면 JSON 데이터를 보낼 수 없습니다. 아래에 코드와 내가 발행 할 곱슬 문장을 추가했습니다. 결과에 대해서는 AuthenticationResource 및 Account Resource 클래스를 참조하십시오. 다음과 같이Restlet Post 요청이 전달 된 JSON 데이터를 제공하지 않습니다.

public class Executable{ 

    public static void main(String[] args) throws Exception{ 
     Component com = new Component(); 
     com.getServers().add(Protocol.HTTP, 8182); 
     com.getDefaultHost().attach("/myapi", new RoutingApp()); 
     com.start(); 
    } 
} 

public class RoutingApp extends Application { 

    public RoutingApp() { 
     super(); 
    } 

    @Override 
    public synchronized Restlet createInboundRoot() { 

     Context context = getContext(); 
     Router router = new Router(context); 

     router.attach("/account/create", AccountResource.class); 
     router.attach("/authenticate", AuthenticationResource.class); 

     ChallengeAuthenticator authenticator = new ChallengeAuthenticator( 
       context, ChallengeScheme.HTTP_BASIC, "myapi"); 

     MySecretVerifier verifier = new MySecretVerifier(); 
     MyEnroler enroler = new MyEnroler(); 
     authenticator.setVerifier(verifier); 
     authenticator.setEnroler(enroler); 

     MyAuthorizer authorizer = new MyAuthorizer(); 
     authorizer.setNext(router); 

     authenticator.setNext(authorizer); 

     return authenticator; 
    } 
} 

public class MySecretVerifier extends SecretVerifier { 

    @Override 
    public int verify(String identifier, char[] secret) { 

     [... Get User by identifier ...] 

     if([... Check User Secret ...]) { 
      Request request = Request.getCurrent(); 
      request.getAttributes().put("currentUser", user); 
      return SecretVerifier.RESULT_VALID; 
     } else { 
      return SecretVerifier.RESULT_INVALID; 
     } 
    } 
} 

public class MyEnroler implements Enroler { 

    @Override 
    public void enrole(ClientInfo ci) { 

     Request request = Request.getCurrent(); 
     User user = (User) request.getAttributes().get("currentUser"); 

     if(null != user) { 

      [... Get User Roles ...] 

      for([... Each Role ...]) { 
       Role role = newRole(r.name, ""); 
       ci.getRoles().add(role); 
      } 
     } 
    } 
} 

public class MyAuthorizer extends Authorizer { 

    @Override 
    protected boolean authorize(Request request, Response response) { 

     ClientInfo info = request.getClientInfo(); 
     Method method = request.getMethod(); 
     User user = (User) request.getAttributes().get("currentUser"); 
     String uri = request.getResourceRef().getRemainingPart(true, false); 
     List<Role> userRoles = info.getRoles(); 

     boolean authorized = false; 

     if([... Check if User is Authorized ...]) { 
      request.getAttributes().putAll([... add some properties from a HashMap ...]); 
      authorized = false; 
     } 

     return authorized; 
    } 
} 

public class AuthenticationResource extends ServerResource { 

    @Post("json:json") 
    @Override 
    public String performPost(Representation entity) { 

     Request request = Request.getCurrent(); 

     request.getEntityAsText();  //returns { "id" : "larry", "secret" : "test" } 
     request.getEntity().getText(); //returns null 
     entity.toString();     //returns [application/json] 
     entity.getText();     //returns null 
    } 
} 

public class AccountResource extends ServerResource { 

    @Post("json:json") 
    @Override 
    public String performPost(Representation entity) { 

     Request request = Request.getCurrent(); 

     request.getEntityAsText();  //returns null 
     request.getEntity().getText(); //returns null 
     entity.toString();     //returns [application/json] 
     entity.getText();     //returns null 
    } 
} 

내 CURL 문은 다음과 같습니다 경우 다른 사람에

curl -i --user larry:test -H "Content-Type: application/json" -X POST -d '{ "id" : "larry", "secret" : "test" }' http://localhost:8182/myapi/account/create 
curl -i --user larry:test -H "Content-Type: application/json" -X POST -d '{ "id" : "larry", "secret" : "test" }' http://localhost:8182/myapi/authenticate 

답변

0

이 유사한 문제로 실행, 실제로 문제였다 클래스 "AccountResource"의 이름이었다. 이유는 모르겠지만, 문제를 일으키고있는 Restlet에 내장 된 AccountResource 인터페이스와 관련이 있다고 가정 할 수 있습니다.