tutorial sistema parte español crear consumir con autenticación autenticacion api laravel-5 multiple-databases connections lumen

api - sistema - laravel passport tutorial español



Laravel API se conecta a múltiples bases de datos (1)

Estoy construyendo una API REST con Laravel (Lumen). La idea es que esta API proporciona el back-end para múltiples sitios web de pedidos de alimentos. Comparten la misma lógica de back-end (modelos, controladores, etc.). De esta forma, cada sitio web solo necesita su propia aplicación de front-end. Estoy planeando usar Angular para esto. Cada sitio web tendrá sus propios datos (productos, páginas, etc.), que deben almacenarse en diferentes bases de datos.

He definido múltiples conexiones dentro de config/databases.php para fines de prueba. Ahora puedo configurar dinámicamente la conexión antes de consultar la base de datos correspondiente, como esta:

class ProductController extends Controller { /** * Display a listing of the resource. * * @return Response */ public function index() { $products = new Product; $products->setConnection(''customer_two''); // <-- $products = $products->get(); return response()->json($products); } }

Lo mismo se puede hacer con el almacenamiento en caché, por ejemplo.

¿Cuál es la mejor manera de que la API sepa qué sitio web del cliente realizó la solicitud? Necesito señalar la base de datos correcta. Además, ¿podría este enfoque causar algún problema de rendimiento?


Usaría un enfoque de dos puntas para resolver este problema y usaría el primero sin el segundo.

El primero se basaría en la ruta que utiliza la solicitud de la API. Por ejemplo, podría definir sus rutas con el prefijo como /api/{site} . De esta forma, todos sus puntos finales api se basarán en la variable de sitio solicitada. Por ejemplo, /api/site1/login usaría la base de datos site1 y /api/site2/login usaría la base de datos site2 .

La segunda parte de esto es usar JWT para autenticarse como usted mencionó anteriormente y en cada solicitud usar un Middleware para verificar si el usuario autenticado es realmente parte de los usuarios de ese sitio en particular. Sin embargo, esto es realmente bueno para las rutas autenticadas y aún deja abiertas sus rutas no autenticadas para abuso, sin embargo, si hay un usuario legítimo en su sitio y su sitio solicita los datos de la API, debe tener los datos correctos del site y cualquier otro el acceso malicioso solo obtendrá datos públicos de todos modos.

Existe potencialmente una tercera opción también. con JWT puede crear reclamos personalizados. Estas reclamaciones personalizadas se podrían usar para almacenar el sitio que se está usando y a qué base de datos acceder. No he hecho esto por mí mismo, pero he estado pensando en hacer algo similar para autenticar al cliente en contra de mi apis, así como la autenticación basada en el usuario además de eso. Esto significa que todos los puntos finales al menos serán autenticados por el cliente y otros también serán autenticados por el usuario y autenticados por el cliente.

Usar middleware para cambiar fácilmente la conexión de la base de datos en tiempo de ejecución.

Middleware: aplicación / Http / Middleware / DatabaseConnectionChooser.php

<?php namespace App/Http/Middleware; use Closure; use Illuminate/Routing/Route; class DatabaseConnectionChooser { /** * Handle an incoming request. * * @param /Illuminate/Http/Request $request * @param /Closure $next * @return mixed */ public function handle($request, Closure $next) { /** @var Route $route */ $route = app(''router'')->getRoutes()->match($request); $connection = $route->getParameter(''connection''); app(''db'')->setDefaultConnection($connection); return $next($request); } }

Agregue este middleware a la aplicación / Http / Kernel.php class a la propiedad $ middleware.

protected $middleware = [ ... /App/Http/Middleware/DatabaseConnectionChooser::class, ];

Crea tus rutas para especificar el sitio, también conocido como la conexión de la base de datos.

aplicación / Http / routes.php

app(''router'')->get(''/{connection}/'', function () { return app(''db'')->getDefaultConnection(); });

Configure su conexión de base de datos en su configuración.

config / database.php

''connections'' => [ ... ''site1'' => [ ''driver'' => ''mysql'', ''host'' => env(''DB_HOST'', ''localhost''), ''database'' => env(''DB_DATABASE'', ''forge1''), ''username'' => env(''DB_USERNAME'', ''forge1''), ''password'' => env(''DB_PASSWORD'', ''''), ''charset'' => ''utf8'', ''collation'' => ''utf8_unicode_ci'', ''prefix'' => '''', ''strict'' => false, ], ''site2'' => [ ''driver'' => ''mysql'', ''host'' => env(''DB_HOST'', ''localhost''), ''database'' => env(''DB_DATABASE'', ''forge2''), ''username'' => env(''DB_USERNAME'', ''forge2''), ''password'' => env(''DB_PASSWORD'', ''''), ''charset'' => ''utf8'', ''collation'' => ''utf8_unicode_ci'', ''prefix'' => '''', ''strict'' => false, ], ... ]