Php 如何在Laravel 5中禁用自动登录?

Php 如何在Laravel 5中禁用自动登录?,php,laravel-5,Php,Laravel 5,我对Laravel是新手,但我爱上了这个框架,并决定在我的项目中使用它 我有一个字段处于活动状态,默认情况下我将其设置为0。在trunt()方法中,我将$credentials['active']=1。当我注销并再次登录时,效果很好 但当我注册一个用户时,它会自动让用户登录,而无需检查活动字段 我假设您正在控制器中使用AuthenticatesAndRegistersUsers特性 注册由该trait中的postrester()方法进行,该方法在创建新用户后调用login()方法 只有当活动字段

我对Laravel是新手,但我爱上了这个框架,并决定在我的项目中使用它

我有一个字段
处于活动状态
,默认情况下我将其设置为
0
。在
trunt()
方法中,我将
$credentials['active']=1
。当我注销并再次登录时,效果很好


但当我注册一个用户时,它会自动让用户登录,而无需检查活动字段

我假设您正在控制器中使用
AuthenticatesAndRegistersUsers
特性

注册由该trait中的
postrester()
方法进行,该方法在创建新用户后调用
login()
方法

只有当
活动
字段为
true
时,才能在控制器中重写此方法并调用
login()
方法。因此,您的
postRegister()
方法类似于:

public function postRegister(Request $request)
{
    $validator = $this->registrar->validator($request->all());

    if ($validator->fails())
    {
        $this->throwValidationException(
            $request, $validator
        );
    }

    $user = $this->registrar->create($request->all());

    if ($request->get('active')) {
        $this->auth->login($user);
    }

    return redirect($this->redirectPath());
}

在registersUsers.php中,替换以下行:

Auth::guard($this->getGuard())->login($this->create($request->all()));
以下是:

$this->create($request->all());

这对我很有效,我使用Laravel 5.2我会避免将
活动
字段添加到凭证中-这是一个授权问题,而不是身份验证问题

为此,我将使用中间件来检查登录用户是活动的还是非活动的。 在5.3中,中间件如下所示:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;

class RedirectIfInactive
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ( $user = Auth::guard('web')->user() ) {
            if ( ! $user->active )
                return redirect(route('account_inactive'));
        }

        return $next($request);
    }
}
最后我们用它来保护我们的所有路线:

Route::get('inactive', ['as' => 'account_inactive', function () {
    return view('inactive');
}]);

Route::group(['prefix' => 'admin', 'namespace' => 'Admin', 'middleware' => 'inactive'], function () {
    Route::get('/', ['as' => 'admin.home', 'uses' => 'AdminController@index']);
});
当然,这种方法的优点是,我们可以显示一条比一般的“这些凭据与我们的记录不匹配”更相关的错误消息,而这些消息是具有错误身份验证详细信息的人得到的。所以用户会知道他们不能登录不是他们的错


无论如何,使用已接受答案中的方法,确保用户成功重置密码时,您也执行了相同的操作,因为他们也会自动登录。

覆盖核心文件不是一个好主意。您可以在
Auth\RegisterController
中重写该方法,这样,如果有更新,它就不会删除您自定义的内容。
Route::get('inactive', ['as' => 'account_inactive', function () {
    return view('inactive');
}]);

Route::group(['prefix' => 'admin', 'namespace' => 'Admin', 'middleware' => 'inactive'], function () {
    Route::get('/', ['as' => 'admin.home', 'uses' => 'AdminController@index']);
});