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

War es hilfreich?

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top