0

次のルートがあります。

/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 attributeofへのアクセスが失わprojectNameれます。URL パターンが変更されて機能が損なわれる可能性があるため、projectName を検索するために URL を自分で解析したくありません。つまり、2 が必要です。 1つではなく変化します。

これを達成する方法はありますか?

4

1 に答える 1

2

標準の RoleAuthorizer クラスを使用して、許可された役割のリストを提供します。カスタム エンローラーはおそらく 2 つに分割されます。次に、このような処理を行うカスタム フィルター クラスを追加して、エンローラーを呼び出します。

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 が呼び出されたときに、enroller は clientInfo.getRoles() Collection に適切な値を設定します。

于 2012-09-24T10:37:22.557 に答える