Restlet: Chaining multiple routers with different authentication methods
-
23-12-2019 - |
Frage
I have 2 ways to authenticate my user and multiple routes attached to my single router. And for security reasons, I want to split my router in 2 routers with their own authentication method.
So far I have:
Router router = new Router(getContext());
BBasicAuthenticator basicAuth = new BBasicAuthenticator(getContext(), true, false);
BCookieAuthenticator cookieAuth = new BCookieAuthenticator(getContext(), false, false);
Enroler enroler = new Enroler();
router.attach("route1/only/basicAuth", Resource1.class);
router.attach("route2/only/basicAuth", Resource2.class);
router.attach("route3/only/cookieAuth", Resource3.class);
router.attach("route4/only/cookieAuth", Resource4.class);
..
basicAuth.setNext(cookieAuth);
basicAuth.setEnroler(enroler);
cookieAuth.setNext(router);
cookieAuth.setEnroler(enroler);
is it possible to have two different routers and each one will have its own authentication method. How can I chain two routers?
ideally something like that:
Router basicRouter = new Router(getContext());
Router cookieRouter = new Router(getContext());
BBasicAuthenticator basicAuth = new BBasicAuthenticator(getContext(), true, false);
BCookieAuthenticator cookieAuth = new BCookieAuthenticator(getContext(), false, false);
Enroler enroler = new Enroler();
basicRouter.attach("route1/only/basicAuth", Resource1.class);
basicRouter.attach("route2/only/basicAuth", Resource2.class);
..
cookieRouter.attach("route3/only/cookieAuth", Resource3.class);
cookieRouter.attach("route4/only/cookieAuth", Resource4.class);
..
basicAuth.setNext(basicRouter);
basicAuth.setEnroler(enroler);
//how to set next cookieRouter
cookieAuth.setNext(cookieRouter);
cookieAuth.setEnroler(enroler);
Thanks for your help guys.
UPDATE 1:
router.attach("/v1/invoices/{invoice_id}/installments/{id}", InvoiceInstallmentResource.class);
router.attach("/v1/{object_type}/{id}/change-status", ChangeStatusResource.class);
####
router.attach("/v1/accounts", AccountsResource.class);
router.attach("/v1/accounts/{id}", AccountResource.class);
router.attach("/v1/items/{id}", ItemResource.class);
router.attach("/v1/items", ItemsResource.class);
....
The first two routes are "old services" that we need to maintain, they use a cookie authentication. The following routes are the new ones, using basic-auth.
The problem here is that with the cookie authentication, all the resources are accessible, but only the first two routes should be accessible.
Thanks
Lösung
This is a tricky case. Here is a solution using nested routers and default routes.
BCookieAuthenticator cookieAuth1 = new BCookieAuthenticator(getContext(), false, false);
cookieAuth1.setNext(InvoiceInstallmentResource.class);
BCookieAuthenticator cookieAuth2 = new BCookieAuthenticator(getContext(), false, false);
cookieAuth2.setNext(ChangeStatusResource.class);
BBasicAuthenticator basicAuth = new BBasicAuthenticator(getContext(), true, false);
basicAuth.setNext(router2);
router2.attach("/v1/accounts", AccountsResource.class);
router2.attach("/v1/accounts/{id}", AccountResource.class);
router2.attach("/v1/items/{id}", ItemResource.class);
router2.attach("/v1/items", ItemsResource.class);
router1.attach("/v1/invoices/{invoice_id}/installments/{id}", cookieAuth1);
router1.attach("/v1/{object_type}/{id}/change-status", cookieAuth2);
router1.attachDefault(basicAuth);