重定向在Laravel Auth中的LogSuccessfulLogin句柄中不起作用

时间:2016-10-15 11:10:08

标签: laravel laravel-routing laravel-5.3 laravel-authorization laravel-events

我正在使用Laravel 5.3,其中Auth用于用户控制器。 所以基本上我为Listener事件

创建Auth
'Illuminate\Auth\Events\Login' => [
    'App\Listeners\LogSuccessfulLogin',
],

并在LogSuccessfulLogin handle()功能重定向用户基于role。但我的重定向功能不起作用。它呈现默认页面'\ home'路线。

我正在分享我的档案: -

EventServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Event;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider
{
    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        'App\Events\SomeEvent' => [
            'App\Listeners\EventListener',
        ],
        'Illuminate\Auth\Events\Login' => [
            'App\Listeners\LogSuccessfulLogin',
        ],
    ];

    /**
     * Register any events for your application.
     *
     * @return void
     */
    public function boot()
    {
        parent::boot();

        //
    }
}

路线/ web.php

<?php
//Auth::routes();
Route::get('logout', function(){
    Auth::logout(); // logout user
    return Redirect::to('/');
});
#Route::get('/', 'HomeController@index')->name('homepage');
Route::get('/', function () {return view('welcome');});

Route::group(['middleware' => ['auth', 'checkrole:Admin'],'namespace' => 'Admin','prefix' => 'admin'], function () {
    Route::get('/123','DashboardController@index')->name('dashboard');
    #Route::get('/','DashboardController@index')->name('dashboard');

    Route::get('user/profile', function () {
        // Uses Auth Middleware
    });
});

这里是LogSuccessfulLogin.php

<?php

namespace App\Listeners;

use Illuminate\Auth\Events\Login;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Redirect;
class LogSuccessfulLogin
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  Login  $event
     * @return void
     */
    public function handle(Login $event)
    {

        $user=Auth::User()->role->role_name;
        if($user=="Admin"){
            return Redirect::route('dashboard');
            #return redirect()->route('login');
        }
        elseif($user == "Employer" ){
            dd("hello");
        }
    }
}

这是Auth

的默认登录控制器
<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;

class LoginController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles authenticating users for the application and
    | redirecting them to your home screen. The controller uses a trait
    | to conveniently provide its functionality to your applications.
    |
    */

    use AuthenticatesUsers;

    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectTo = '/home';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest', ['except' => 'logout']);
    }
}

如果我做错了,请告诉我。 实际上我也尝试在LogSuccessfulLogin监听器中使用return redirect()->route('login');重定向页面,但它也无效。

1 个答案:

答案 0 :(得分:2)

作为可能的解决方案之一,我将提供一个响应中间件,它将附加到登录路由。收到回复后,您应检查用户是否已登录,如果是,则应用自定义重定向登录。在这种情况下,您将覆盖默认的Laravel 5.3重定向逻辑。像这样的Smth:

class PostLoginMiddleware
{

    public function handle($request, Closure $next, $guard = null)
    {
        // here you've already have response and it's usually redirect
        $response = $next($request);

        // if user logged in
        if (\Auth::id()) {
             $customRedirectResponse = // ...apply your custom logic

             return $customRedirectResponse;
        }

        return $response;
    }
}

您应该在

中的app / Http / Kernel.php中定义此中间件
protected $routeMiddleware = [
    'custom-redirect' => \YourNamespace\PostLoginMiddleware::class
];

然后将其应用于登录路线

/* Authentication Routes */
$this->get('login', 'Auth\AuthController@showLoginForm');
$this->post('login', ['middleware' => 'custom-redirect', 'uses' => 'Auth\AuthController@login']);
$this->get('logout', 'Auth\AuthController@logout');