次のルートがあります。
/projects/{projectName}
と
/projects/{projectName}/Wall/{wallName}
ここで、すべての GET を許可したいのですが、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
) を試してみましたが、うまくいきませんでした。
何も機能していないようです。概念的にはこれでうまくいくはずです。私は通話を傍受しているだけで、リクエストに対して透過的であるだけですが、内部でどのように機能しているかはわかりません。
オーソライザーをガードの直後に移動することはできますが、request attribute
ofへのアクセスが失わprojectName
れます。URL パターンが変更されて機能が損なわれる可能性があるため、projectName を検索するために URL を自分で解析したくありません。つまり、2 が必要です。 1つではなく変化します。
これを達成する方法はありますか?