Restlet: добавление роли в зависимости от того, к какому «проекту» (группе) обращается пользователь - PullRequest
0 голосов
/ 14 августа 2011

Предположим, приложение типа доски. Есть 2 проекта - ProjectA и ProjectB. Пользователь 'nupul' (я) является частью обоих проектов. Для A я администратор, а для B я просто «участник» (без прав администратора)

При доступе к ресурсу на /MySite/ProjectA/Items Я хочу проверить, является ли пользователь администратором или нет.

Я знаю, что это может быть просто сделано, выбрав параметр {projectName} из запроса и используя идентификатор (пользователя, делающего запрос) и перенаправив его для проверки в БД и т. Д.,

Мой вопрос: «Как» я могу добавить роли, используя Enroler «во время» самой аутентификации. Поскольку у меня нет доступа к параметру {projectName} на этом этапе. Я не знаю, нужно ли вам использовать Группы / Царства и т. Д., Чтобы заставить это работать, но, честно говоря, мне просто нужно слишком много времени, чтобы понять, как эффективно это использовать? (т.е. до того, как запрос будет перенаправлен на ресурс)

Я имею в виду, я знаю, что могу создавать эти группы / области, но как мне получить доступ к правильной «роли» из ресурса ???? Серьезно, у Restlet должны быть более реалистичные примеры и намного лучшая документация, показывающая использование его классов !! Это сводит меня с ума! Аутентификация не должна быть такой сложной! :)

1 Ответ

0 голосов
/ 30 августа 2011

Способ сделать то, что вы хотите, это разделить ваши маршрутизаторы на основе имени проекта в вашем приложении (метод createInboundRoot).В этом случае имя проекта будет оценено перед вызовом аутентификатора.Ниже приведены некоторые примеры реализации такого подхода:

public Restlet createInboundRoot() {
    Router rootRouter = new Router(getContext());
    rootRouter.setDefaultMatchingMode(Template.MODE_STARTS_WITH);

    rootRouter.attach("/{projectname}/", createApplicationForProject());
    return rootRouter;
}

private Restlet createApplicationForProject() {
    Router router = new Router(getContext());

    ChallengeAuthenticator guard
             = new ChallengeAuthenticator(getContext(),
                        ChallengeScheme.HTTP_BASIC, "realm");
    guard.setVerifier(verifier);
    guard.setEnroler(enroler);
    guard.setNext(router);

    router.attach("items", ItemsServerResource.class);
    return guard;
}

Используя такой подход, вы получите доступ к значению переменной projectname в верификаторе и сможете использовать его при обработке аутентификации.

Надеюсь, это поможет тебе, Тьерри

...