使用laravel作为前端的代理

voase2hg  于 2023-01-31  发布在  其他
关注(0)|答案(2)|浏览(163)

我有一个laraval项目与react应用程序在同一个项目中,在运行react应用程序之前,我有许多中间件,检查一些授权,如如果一个国家被授权访问与否:

Route::middleware(['firewall.country', 'firewall.ip'])->group(function () {
     Route::get('/{any}', function () {
           return view('app');
      })->where('any', '^(?!api).*$');
});

现在我需要从laravel项目中单独部署react front,我的问题是如何让这个中间件在react应用程序之前保持运行。

zwghvu4y

zwghvu4y1#

您可以在Laravel中添加一个中间件来检查授权并重定向到react应用。然后,您可以在Laravel中添加一个新路由来服务react应用。如果授权失败,Laravel可以返回一个带有错误消息的响应。
在Laravel中创建新中间件:

php artisan make:middleware CheckAuthorization

在中间件的handle方法中添加用于检查授权的代码:

namespace App\Http\Middleware;

use Closure;

class CheckAuthorization
{
    public function handle($request, Closure $next)
    {
        // Code for checking authorization

        // If authorization fails
        if (!$authorized) {
            return response()->json(['error' => 'Not authorized'], 403);
        }

        // If authorization succeeds
        return $next($request);
    }
}

将中间件添加到app/Http/Kernel.php的全局中间件列表中:

protected $middleware = [
    ...
    \App\Http\Middleware\CheckAuthorization::class,
];

在Laravel中添加一条为react应用提供服务的新路线:

Route::get('/{any}', function () {
    return view('react');
})->where('any', '.*');

创建一个新视图以提供react应用,例如react.blade.php,并将react应用包含在视图中:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>React App</title>
    </head>
    <body>
        <div id="root"></div>
        <script src="/js/app.js"></script>
    </body>
</html>

现在,当react应用被访问时,CheckAuthorization中间件将首先运行,并检查用户是否被授权,如果用户未被授权,Laravel将返回错误消息,如果用户被授权,则react应用将被服务。

xmd2e60i

xmd2e60i2#

要使用laravel作为代理,您可以这样做:

Route::get('/check', function ($endpoint) {
  $client = new GuzzleHttp\Client();
  $response = $client->get("https://external-front.com/");
  return response($response->getBody(), $response->getStatusCode())
    ->header('Content-Type', $response->getHeader('Content-Type'));
});

但这是一个坏主意,更好的方法是像这样改变你的laravel端点:

Route::get('/check', function () {
       return 'check';
  })->middleware(['firewall.country', 'firewall.ip']);// here all your middleware before react loaded

然后在react应用中:

const App = () => {
      useLayoutEffect(() => {
           axios.get('/check')
                .catch(function (error) {
                     if (error.response.status == 403) {
                          //redirect to your access denied page 
                      } 
           });
      }, []);
 }

相关问题