【问题标题】:how to check database value in the middleware laravel 5.2如何在中间件 laravel 5.2 中检查数据库值
【发布时间】:2017-01-16 11:40:53
【问题描述】:

我有一个视图,只有在数据库中有“role = interviewer”的用户才能访问。我已经创建了中间件并注册了它,但它似乎没有按预期工作。它允许所有用户,无论他们在数据库中存储的角色如何。

这是我的中间件

class Interviewer
{
    public function handle($request, Closure $next)
    {
        if($request->user()->role == "interviewer"){
             return $next($request);
        }           
    }
}

不知道方法对不对我也试过了

if($request->\Auth::user()->role == "interviewer")

这个也不行。如果用户没有角色采访者,admin 是它应该限制的视图。这是我的路线

Route::get('/candidates', [
    'uses' => 'candidateController@showProfile',
    ])->middleware('auth','interviewer');

我的路由中间件

    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,
    'interviewer'=> \App\Http\Middleware\Interviewer::class,
];

【问题讨论】:

  • 你找到解决办法了吗

标签: laravel laravel-5.2 middleware


【解决方案1】:

如果需要失败,您需要在中间件中返回某些内容,在您的情况下是错误响应。

namespace App\Core\Http\Middleware;

use Tymon\JWTAuth\Middleware\BaseMiddleware;
use Tymon\JWTAuth\Exceptions\JWTException;
use Tymon\JWTAuth\Exceptions\TokenExpiredException;

class Employee extends BaseMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, \Closure $next, $role = null)
    {
        $user = $request->user();

        if (! ($user->authenticable instanceof \App\Core\Entities\User)) {
            return response([
                'title'  => 'You may not call this API as a non-employee.',
                'error'  => 'invalid_user_type'
            ], 401); // <-- See? I returned an error!
        }

        if ($role) {
            if (strtolower($user->authenticable->role->name) !== strtolower($role)) {
                return response([
                    'title'  => "You may not call this API as a \"{$user->authenticable->role->name}\".",
                    'error'  => 'unnecessary_permissions'
                ], 401); // And also here!
            }
        }

        return $next($request);
    }
}

【讨论】:

  • 我没有使用任何包,我正在使用 laravel 的默认中间件进行此操作
  • 对不起。我在中间件中使用了包命名空间,它们可能会让你感到困惑。但是,中间件如何工作的概念保持不变。试试我给你看的!
【解决方案2】:

在您的中间件中,您始终需要 returnnext($request)

class Interviewer { 
    public function handle($request, Closure $next) { 
        if($request->user()->role != "interviewer"){
             return back(); 
        } 
        return $next($request);
    } 
}

同时修改您的routes.php。中间件需要在数组中:

Route::get('/candidates', [
    'uses' => 'candidateController@showProfile',
])->middleware(['auth','interviewer']);

【讨论】:

  • 我已经编辑了 Gayan 的答案,但它正在等待同行评审。基本上,您需要像这样在数组中添加中间件:middleware(['auth','interviewer']); 除了 Gayan 建议的内容之外,还可以这样做
  • 感谢@Paras 的改进
猜你喜欢
  • 2016-06-26
  • 1970-01-01
  • 1970-01-01
  • 2017-01-02
  • 2017-10-25
  • 2016-11-06
  • 1970-01-01
  • 1970-01-01
  • 2016-11-27
相关资源
最近更新 更多