laravel 5中间件/检查postlogin()之前的激活状态

时间:2015-11-21 15:23:48

标签: php authentication laravel-5

我需要一些帮助,我创建了一个字段" activation_key",在注册后分配给每个用户。如果用户尝试登录,如果他已激活(激活密钥=空)或不显示(显示错误消息),如何立即检查。此检查过程应在laravel postLogin()运行之前完成。我想我以前必须使用中间件,但不知道逻辑本身,如何判断laravel是否是" true"或"假"。总而言之,我不确定,如何完成这件事......

namespace App\Http\Middleware;

use Closure;

class BeforeMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
         if (Auth::user()->activation_key) {
        // then redirect home cause they're not activated
        //return redirect('home');
        //not active ;()
        dd("not active seems ugly :I");
    }

    dd("you're active yay");

    }
}

路线:

// Authentication routes...
Route::get('auth/login', '***');
Route::post('auth/login', 'Auth\AuthController@postLogin');
Route::get('auth/logout', 'Auth\AuthController@getLogout');

一切顺利;

2 个答案:

答案 0 :(得分:1)

你走在正确的轨道上。

public function handle($request, Closure $next)
{
    // if they have a key...
    if (Auth::user()->activation_key) {
        // then redirect home cause they're not activated
        return redirect('home');
    }

    return $next($request);
}

上述作品,但这部分内容不佳:!Auth::user()->activation_key

您可以将其抽象为用户模型上的方法:

public function isNotActivated()
{
    return $this->activation_key ? true : false;
}

然后您的中间件可以阅读:

public function handle($request, Closure $next)
{
    // // if they have a key...
    if (Auth::user()->isNotActivated()) {
        return redirect('home');
    }

    return $next($request);
 }

编辑:

要为每个请求注册中间件,请在$middleware

中添加kernal.php数组
protected $middleware = [
    \App\Http\Middleware\Activation::class,
];

或您应用中的特定路线:

protected $routeMiddleware = [
    // ...
    'activation' => \App\Http\Middleware\Activation::class,

];

然后在routes.php中引用该中间件:

Route::get('users/profile', ['middleware' => 'activation', function () {
    //
}]);

请参阅:http://laravel.com/docs/master/middleware#registering-middleware

答案 1 :(得分:0)

Auth :: user将在身份验证完成之前返回null,并且我不想让用户只能登录才能使用Auth :: user。所以,我为dtj的回答做了以下修改。

这是我的中间件

public function handle($request, Closure $next)
{
    if(User::isNotActivated($request->email)) {
        return redirect('home');
    }

    return $next($request);
}

这是我的UserRepository

public static function isNotActivated($email)
{
    $user = User::findUserByLogin($email);

    return $user->activated ? false : true;
}

而且,这是我的用户模型

public static function findUserByLogin($email)
{
    return static::where('email', $email)->first();
}

这样,我使用通过帖子传递的电子邮件,在数据库中找到它,检查激活的列,并返回结果。