Laravel改进了用于检查Userstatus的代码

时间:2017-08-31 13:56:51

标签: php laravel laravel-5.4

在我的应用程序中,我可以将用户标记为已阻止。在被阻止的标记后,他无能为力。

我的解决方案是检查每个构造控制器中的状态,如果经过身份验证的用户被标记为阻止,他将重定向到视图。

但我的解决方案并不是很好,因为我已经公开了代码,我必须检查实际路线。

这是我的代码:

 public function __construct()
{
    $this->middleware('auth');

    $this->middleware(function ($request, $next)
    {
        $this->user= Auth::user();
        if(strcmp(Route::currentRouteName(),  'user.password.show') != 0)
        {
            if(strcmp(Route::currentRouteName(),  'user.password.set') != 0)
            {

                if(strcmp(Route::currentRouteName(),  'user.blocked.show') != 0)
                {
                    if($this->user->status == Userstatus::where('type', 'passwordSetFalse')->first()->id)
                    {
                        Session::flash('error', 'Bitte setzen Sie ihr Passwort!');
                        return Redirect::route('user.password.show');
                    }
                    else
                    {
                        return $next($request);
                    }
                }else
                {
                    return $next($request);
                }
            }
            else
            {
                return $next($request);
            }
        }
        else
        {
            return $next($request);
        }
    });
}

我搜索了一个解决方案,我把代码放了一次,我可以将它用于我的所有控制器,但我不知道代码可以写在哪里。

非常感谢你的帮助

2 个答案:

答案 0 :(得分:0)

看看Laravel Middlewares。定义一个中间件,在将请求传递给控制器​​之前检查用户状态,而不是在app/Http/Kernel.php中注册中间件。

<?php

namespace App\Http\Middlewares;

class UserBlockedMiddleware
{

    public function handle($request, $next)
    {
         $user = \Auth::user();
         if($user->status == 'blocked') abort(403);

         return $next($request);

    }

}

要详细了解如何注册全局中间件,请在Laravel文档中查看此section

答案 1 :(得分:0)

您需要了解Protecting Routes

您可以将auth中间件附加到要保护的路由,或直接在控制器的__construct

  

Laravel附带一个auth中间件,在Illuminate \ Auth \ Middleware \ Authenticate中定义

如果您需要own Auth middleware,可以输入以下内容

php artisan make:middleware MyOwnAuth

你也可以实际减少代码

public function __construct()
{
    $this->middleware('auth');

    $this->middleware(function ($request, $next) {
        $this->user = Auth::user();
        if (
            strcmp(Route::currentRouteName(), 'user.password.show') != 0
            && strcmp(Route::currentRouteName(), 'user.password.set') != 0
            && strcmp(Route::currentRouteName(), 'user.blocked.show') != 0
            && $this->user->status == Userstatus::where('type', 'passwordSetFalse')->first()->id
        ) {
            Session::flash('error', 'Bitte setzen Sie ihr Passwort!');
            return Redirect::route('user.password.show');
        };
        return $next($request);
    });
};