【问题标题】:Can i create a middleware that executes an guzzle request?我可以创建一个执行 guzzle 请求的中间件吗?
【发布时间】:2021-06-15 22:56:50
【问题描述】:

我需要检查 spatie/laravel-permission 提供的用户角色,我想知道是否可以在每个路由上执行的中间件中创建一个 guzzle 请求。

对于我使用 Laravel/Passport 的 API。

也欢迎提出其他/更好方法的建议。

【问题讨论】:

  • 你不能直接在中间件中访问用户吗?我认为没有理由使用 guzzle 向路由发出不同的请求来检查这一点。
  • 前端和后端是分开的,所以我不能在不发出请求的情况下访问用户,但主要目标是在我的 .blade.php 加载之前返回这个角色在,@killstreet
  • 在阅读了 spatie/laravel-permission 的一些文档之后,看起来您应该能够在刀片中使用 @can () 方法。 spatie.be/docs/laravel-permission/v3/introductionlaravel.com/docs/8.x/authorization#via-blade-templates。这还不够吗?您的问题中的信息也很少,也许可以告诉您您想要实现什么?这样我们就可以寻找其他方法。问题现在有点抽象,需要详细说明。
  • @killstreet 好的,就像这样:后端身份验证功能完全,如果用户没有正确的用户角色继续进行,则没有问题用户会被阻止或重定向请求。但是前端刀片文件必须进行HTTP调用以从服务器接收信息以知道分配给用户的角色,因此在执行ajax调用之前加载刀片文件,因此@can是没有选择的.这就是为什么我想知道是否可以在加载刀片文件之前使用 guzzle 进行 api 调用。我希望这可以阐明目标,:D
  • 通常当需要权限并且后端和前端是分开的时,您使用本地存储或任何前端挂钩之类的东西,在登录时存储权限并在前端使用它以避免再次从后面检查它

标签: php laravel guzzle laravel-passport laravel-permission


【解决方案1】:

这个代码用于 Guzzle http 请求:

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
use Session;

class CheckPermission
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next, $requiredRoles="none")
    {

        $response = Http::withToken(Session::get('accessToken'))->withHeaders([
                    "User-Agent" => "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36",
                    "Origin" => "http://base.fourdesign-test.nl",
                    'Content-Type' => "application/json",
                    "Access-Control-Allow-Origin" => '*'])->withOptions(['base_uri' => env('API_URL')])->get("/api/checkpermission");

        if(!$response) {
            die();
        }

        if($requiredRoles == "none" && empty($response['userRoles'])) {
            return $next($request);
        } else if(empty($response['userRoles'])) {
            return redirect('/login');
        }

        $requiredRoles = explode("|", $requiredRoles);
        $allowRequest = false;
        foreach ($response['userRoles'] as $userRole) {
            Session::put($userRole, true);
            foreach ($requiredRoles as $requiredRole) {
                if ($requiredRole == 'none') {
                    $allowRequest = true;
                }
                if ($requiredRole == $userRole) {
                    $allowRequest = true;
                }
            }
        }

        if ($allowRequest === true) {
            return $next($request);
        }

        return redirect()->back();
    }
}

【讨论】:

    猜你喜欢
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 2022-11-04
    • 2018-12-02
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    相关资源
    最近更新 更多