【问题标题】:Middleware affect bindings for insert in database中间件影响数据库中插入的绑定
【发布时间】:2016-08-09 14:44:22
【问题描述】:

我的 laravel 应用有问题。

我想在路由上添加用于等级控制的中间件。

当我将自定义中间件添加到我的路由组时,SQL 语句的绑定是双倍的。

当我取下我的自定义中间件时,它工作正常。

我真的不明白为什么。

还有我的 AuthRank.php :

class AuthRank {

public function handle($request, Closure $next, $rank)
{
    $response = $next($request);

    $user = Auth::user();

    if(!$user || $user->rank < $rank)
    {
          return redirect('/');
    }

    return $next($request);
}}

这是我的 Kernel.php :

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Adldap\Laravel\Middleware\WindowsAuthenticate::class, // Inserted here.
    ],
    'api' => [
        'throttle:60,1',
    ],
];

/**
 * The application's route middleware.
 *
 * These middleware may be assigned to groups or used individually.
 *
 * @var array
 */
protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'auth.rank' => \App\Http\Middleware\AuthRank::class, 
];

还有我的 Routes.php 的摘录:

 Route::group(['prefix' => 'GestionUtilisateurs','middleware' =>'auth.rank:99'], function () 
{
    Route::post('/copy', ['uses' => 'userController@copyUser']);
});

自定义中间件问题的结果:

语句:插入 MY_TABLE (DATE, USER_ID, ROLE_ID) 值 (:p0, :p1, :p2) 绑定:[2016/08/09,2016/08/09,1,1,99,99]

没有我的自定义中间件,它会返回我:

语句:插入 MY_TABLE (DATE, USER_ID, ROLE_ID) 值 (:p0, :p1, :p2) 绑定:[2016/08/09,1,99]

这很好

我知道默认情况下的“网络”中间件

app/providers/RouteServiceProvider.php

但是当我删除它时,我的身份验证不起作用。

为什么它不适用于我的自定义中间件?

谢谢!

【问题讨论】:

  • 您在中间件中调用了$next($request); 两次。你的控制器的动作被执行了两次。所以,你得到了 TWICE 的记录。您发现这是因为您的中间件,您没有检查您在其中重复两次的内容?

标签: php laravel laravel-5 laravel-5.2


【解决方案1】:

我没有看到任何可能影响您的查询的代码。我所看到的是您的代码似乎有错误:

class AuthRank {

    public function handle($request, Closure $next, $rank)
    {
        // Isn't this repeated unnecessarily?
        // $response = $next($request);

        $user = Auth::user();

        if(!$user || $user->rank < $rank) {
            return redirect('/');
        }

        return $next($request);
    }
}

尝试删除多余的代码。如果它不起作用,请提供更多详细信息,说明您是如何创建受影响的查询的,我们可能会提供更多帮助。

【讨论】:

  • 由于到处搜索,我们忘记了本质..错误就在那里..非常感谢您的回答!
猜你喜欢
  • 2014-12-16
  • 2018-11-20
  • 2011-07-16
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多