3

如果凭据正确,我正在验证我的用户并将他重定向到仪表板。我想保护仪表板路由并添加中间件身份验证,但现在它总是重定向到登录页面。

路由.php

Route::get('login', array('uses' => 'HomeController@showLogin'));
Route::post('login', array('uses' => 'HomeController@doLogin'));
Route::get('logout', array('uses' => 'HomeController@doLogout'));

Route::group(['middleware' => 'auth'], function() {
    Route::get('/', function () {
        return view('dashboard');
    });
    Route::get('dashboard', function () {
        return view('dashboard');
    });
});

家庭控制器.php

public function showLogin(){
    return View::make('login');
}

public function doLogin(Request $request){
    $rules = array(
        'email'    => 'required|email',
        'password' => 'required|alphaNum|min:3'
    );
    $validator = Validator::make($request::all(), $rules);
    if ($validator->fails()) {
        return Redirect::to('login')
            ->withErrors($validator)
            ->withRequest($request::except('password'));
    }
    else {
        $userdata = array(
            'email'     => $request::get('email'),
            'password'  => $request::get('password')
            /*'password' => Hash::make($request::get('password'))*/
        );
        if (Auth::attempt($userdata)) {
            $userid = Auth::id();
            return redirect()->intended('/');
        } else {
            return Redirect::to('login');
        }
    }
}

public function doLogout()
{
    Auth::logout();
    return Redirect::to('login');
}

中间件Authenticate.php

public function handle($request, Closure $next, $guard = null)
{
    if (Auth::guard($guard)->guest()) {
        if ($request->ajax()) {
            return response('Unauthorized.', 401);
        } else {
            return redirect()->guest('login');
        }
    }

    return $next($request);
}

中间件RedirectIfAuthenticated.php

public function handle($request, Closure $next, $guard = null)
{
    if (Auth::guard($guard)->check()) {
        return redirect('/');
    }

    return $next($request);
}
4

2 回答 2

1

我不确定为什么您的代码不起作用,但您可以尝试替换:

if (Auth::attempt($userdata)) {
    $userid = Auth::id();
    return redirect()->intended('/');
}

和:

if (Auth::attempt($userdata)) {
    $userid = Auth::id();
    return redirect('dashboard');
}

来自预期方法的 API Docs

为先前预期的位置创建新的重定向响应。

正在给您一些错误,因为它要返回上一个位置而不是下一个位置。


更新 1:

我会采用以下方法。

制作自己的中间件,称为UserAlreadyLoggedIn

php artisan make:middleware UserAlreadyLoggedIn

UserAlreadyLoggedIn.php使用以下代码打开和更新句柄方法:

/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
public function handle($request, Closure $next)
{
    if(auth()->check()) {
        return $next($request);
    }

    return redirect('login');
}

将其注册到数组app/Http/Kernel.php内的文件中:$routeMiddleware

$routeMiddleware = [
    'user_already_logged_in' => \App\Http\Middleware\UserAlreadyLoggedIn::class,
];

通过使在控制器中分离已经登录的用户UserSessionsController

php artisan make:controller UserSessionsController --plain

里面UserSessionsController放置__constructor方法:

/**
 * Check if the user is already logged in.
 *
 * @return void
 */
public function __construct()
{
    $this->middleware('user_already_logged_in');
}

路由.php

Route::get('login', 'HomeController@showLogin');
Route::post('login', 'HomeController@doLogin');
Route::get('logout', 'HomeController@doLogout');

// Replace the dashboard code inside the dashboard method..
Route::get('dashboard', 'UserSessionsController@dashboard');

我将再次创建一个名为的中间件UserIsAGuest,并替换方法if内的块handle

if(auth()->guest()) {
    return $next($request);
}
return redirect('dashboard');

然后在HomeController's__construct方法里面:

/**
 * Check if the user is already logged in.
 *
 * @return void
 */
public function __construct()
{
    // Register the middleware in Kernel.php file
    $this->middleware('user_is_guest');
}

希望这可以帮助你。快乐编码。干杯。

于 2015-12-30T10:28:32.357 回答
0

很抱歉迟到了,但是经过长时间的搜索,我不得不将中间件从更改['middleware' => 'auth]['middleware' => 'auth:web']

我希望这会有所帮助

于 2021-10-02T13:07:02.813 回答