在Laravel Auth中自定义重定向

时间:2018-12-04 20:07:08

标签: laravel laravel-routing laravel-authentication

我想自定义Laravel身份验证。我想区分管理员和用户。在默认用户表中,我添加了带有两个选项的列角色:admin和user。根据手册,我正在定义redirectTo方法。

class LoginController extends Controller
{
    use AuthenticatesUsers;

    /**
     * Where to redirect users after login.
     */

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

    protected function redirectTo()
    {
        if (Auth::user()->role == 'admin') {
            return 'admin/home';
        } else {
            return '/main';
        }
    }

    protected function show_admin_homepage()
    {
        return view('auth.admin_h');
    }

    protected function show_user_homepage()
    {
        return view('auth.user_h');
    }
}

路线

Route::get('main', 'Auth\LoginController@show_user_homepage')->name('show_user_homepage');
Route::get('admin/home', 'Auth\LoginController@show_admin_homepage')->name('show_admin_homepage');

问题是,当我以用户或管理员身份登录时,我总是重定向到默认的laravel主视图。我在做什么错了?

3 个答案:

答案 0 :(得分:1)

您应该使用handle文件中的RedirectIfAuthenticated.php文件的App/Http/Middleware方法来更改重定向

该方法如下:

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

    return $next($request);
}

答案 1 :(得分:0)

  

我想区分管理员和用户...

不是尝试重新创建轮子并修改Auth,而是为什么不使用已构建且易于使用的东西呢?

Spatie/Laravel-Permission可以在这里帮助您很多。

例如,要创建“管理员”角色,只需执行以下操作:

$role = Role::create(['name' => 'admin']);

然后给它一些权限:

$permission = Permission::create(['name' => 'super power']);
$role->givePermissionTo($permission);

并在控制器中为用户模型分配角色

$user->assignRole('admin');

从那里您可以查询用户在控制器中是否具有特定角色:

if( $user->hasRole('admin') )
{
    // The user has the admin role 
    return view('admin-page');

} else {
    // This is a generic user 
    return view('main');

}
在刀片中

OR

@role('admin')
    I took the red pill!
@else 
    I took the blue pill.. 
@endrole 

我建议这样做是因为它具有可伸缩性并且易于集成到您的项目中。随着项目的不断发展,如果您需要为角色添加新权限,则只需一行代码。

答案 2 :(得分:0)

默认的登录控制器使用 AuthenticatesUsers 特征。在特征中,有一个名为 authenticated 的受保护方法,在登录控制器中将其覆盖。

下面是已认证方法

的实现
protected function authenticated($request, $user)
{
    if($user->role == 'admin')
    {
        return redirect('/admin/dashboard');
    }
    else if($user->role == 'user')
    {
        return redirect('/dashboard');
    }
}