我有以下途徑:如何在使用Restlet的「URL中間」添加過濾器?
/projects/{projectName}
和
/projects/{projectName}/Wall/{wallName}
現在我想有所有得到允許,但PUT,POST,DELETE只能由被允許項目成員,即該項目的用戶成員。我有一個特殊的類,給出一個用戶ID和項目名稱,我可以得到用戶的成員身份 - 類似於MyEnroler.getRole(userId, projectName)
- 其中userId是請求標題的一部分,projectName
取自URI。
我試過很多東西,但不起作用。這裏的想法:
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;
}
}
}
現在簡單地做在應用程序中創建入站根時完全失敗如下:
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
請求失敗。該URL從未找到。我猜是因爲它試圖將它與projectRouter
匹配。那麼我嘗試了各種模式(MODE_BEST_MATCH or MODE_FIRST/NEXT_MATCH
)無濟於事。
似乎沒有任何工作。從概念上講,這應該工作。我只是攔截一個電話,只是對請求透明,但不知道內部是如何工作的。
我可以在授權者後面移動授權者,但我無法訪問projectName
的request attribute
- 我不希望自己解析URL來搜索projectName,因爲URL模式可能會更改並會中斷功能 - 即需要2次更改而不是1次。
任何想法如何實現這一目標?