【问题标题】:Customize Redirection in Laravel Auth在 Laravel Auth 中自定义重定向
【发布时间】:2019-05-06 08:01:07
【问题描述】:

我想自定义 Laravel 身份验证。我想区分管理员和用户。在默认用户表中,我添加了具有两个选项的列角色:管理员和用户。根据手册,我正在定义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 主页视图。我做错了什么?

【问题讨论】:

    标签: laravel laravel-routing laravel-authentication


    【解决方案1】:

    默认登录控制器使用 AuthenticatesUsers 特征。在 trait 中,定义了一个名为 authenticated 的受保护方法,在登录控制器中覆盖它。

    下面是authenticated方法的实现

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

    【讨论】:

    • 我找到了解决方案。问题是中间件。在使用来宾中间件的 LoginController 中定义了显示管理员和用户主页的方法。默认。对于这些方法,应该应用 auth 中间件。谢谢大家的参与。
    【解决方案2】:

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

    与其尝试重新创建轮子并修补 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 
    

    我建议这样做,因为它可扩展且易于集成到您的项目中。随着您的项目不断增长,如果您需要为角色添加新权限,只需一行代码。

    【讨论】:

    • 感谢@UkraineInTheMembrane。我听说过这个包裹。我只是想修补一下。原来我这里的手册看不懂。
    【解决方案3】:

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

    It 方法如下所示;

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-18
      • 2018-01-01
      • 2017-08-01
      • 1970-01-01
      • 2020-12-19
      • 2021-01-11
      • 1970-01-01
      相关资源
      最近更新 更多