2012-09-14 5 views
0

나는 다음과 같은 경로가 있습니다Restlet을 사용하여 "URL 중간"에 필터를 추가하는 방법은 무엇입니까?

/projects/{projectName}

지금

/projects/{projectName}/Wall/{wallName}

내가 DELETE, POST를 모두 허용 가도록해야하지만, PUT 싶습니다 만에 의해 허용되어야한다 프로젝트 회원 (즉, 해당 프로젝트의 사용자). 나는 사용자 아이디와 프로젝트 이름을 가진 특별한 클래스를 가지고 있는데, 이는 사용자의 멤버쉽 상태를 얻을 수있다. (예 : MyEnroler.getRole(userId, projectName)) - userId는 요청 헤더의 일부이고 projectName은 URI에서 가져온 것이다.

여러 가지 시도를했지만 작동하지 않습니다. 여기에 아이디어는 다음과 같습니다

Router projectRouter = new Router(getContext()); 
RoleMethodAuthorizer rma = new RoleMethodAuthorizer(); 
//Guard declaration here. Then setNext Restlet 
guard.setNext(projectRouter); 
projectRouter.attach("/projects/{project}",rma); 

Router wallRouter = new Router(getContext()); 
wallRouter.attach("/Wall/{wallName}", WallResource.class); 

rma.setNext(wallRouter); 

//return guard; 

그래서 /projects/stackoverflow/Wall/restlet에 대한 요청이 실패 :
public class RoleMethodAuthorizer extends Authorizer { 
    @Override 
    protected boolean authorize(Request req, Response resp) { 
     //If it's a get request then no need for further authorization. 
     if(req.getMethod().equals(Method.GET)) 
      return true; 
     else 
     {        
      String authorEmail = req.getClientInfo().getUser().getIdentifier(); 
      String projectName = req.getAttributes().get("project").toString(); 

      Role userRole = MyEnroler.getRole(authorEmail, projectName); 

      //forbid updates to resources if done by non-members of project 
      if(userRole.equals(MyEnroler.NON_MEMBER)) 
       return false; 
      //for everybody else, return true 
      return true; 
     } 


    } 

} 

지금 단순히 응용 프로그램에서 인바운드 루트를 만들 때 완전히 실패 다음을 수행. URL을 찾지 못했습니다. projectRouter과 일치 시키려고 했으므로 추측하고 있습니다. 글쎄, 다양한 모드 ( MODE_BEST_MATCH or MODE_FIRST/NEXT_MATCH)를 사용해 보았습니다.

아무 것도 작동하지 않습니다. 개념적으로 이것이 효과가있다. 나는 단지 호출을 가로 채고 요청에 대해 투명하지만, 내부가 어떻게 작동하는지 알지 못합니다.

가디언 직후에 권한 부여 프로그램을 이동할 수 있지만 에 대한 액세스 권한을 잃을 수 있습니다. URL 패턴이 변경되어 중단 될 수 있으므로 projectName을 검색하기 위해 직접 URL을 구문 분석하고 싶지 않습니다. 기능 - 하나 대신 2 개의 변경이 필요합니다.

아이디어를 얻으려면 어떻게해야합니까?

답변

2

표준 RoleAuthorizer 클래스를 사용하여 허용 된 역할 목록을 제공하고 사용자 정의 등록기를 아마도 두 개로 나눠서 다음과 같이 Enrolers를 호출하는 사용자 지정 필터 클래스를 추가 할 것입니다.

protected int beforeHandle(final Request request, final Response response) throws ResourceException { 
    final String projectName = (String) request.getAttributes().get("projectName"); 
    // Check that a projectName is supplied, should not have got this far otherwise but lets check. 
    if (projectName == null || projectName.isEmpty()) { 
     throw new ResourceException(Status.CLIENT_ERROR_NOT_FOUND); 
    } 

    if (Method.GET.equals(request.getMethod())){ 
     new ReadEnroler(projectName).enrole(request.getClientInfo()); 
    }else{ 
     new MutateEnroler(projectName).enrole(request.getClientInfo()); 
    } 

    return super.beforeHandle(request, response); 
} 

enrole은 enrole이 호출 될 때 clientInfo.getRoles() Collection에 적절한 값을 설정합니다.

관련 문제