【问题标题】:How to redirect the authentified user to specific page如何将经过身份验证的用户重定向到特定页面
【发布时间】:2017-09-11 15:51:35
【问题描述】:

我是 laravel 的新手,我创建了 3 种用户

  1. sup 有名为 sup 的视图
  2. ass 有一个名为 ass 的视图
  3. emp 有名为 emp 的视图

在用户表中,我添加了名为role的行,让我可以区分每个提到的用户类别。

这是表用户:

 public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->char('role',3);
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

我希望当每个人都验证他将被重定向到他的特定视图,所以我想如果我可以改变

受保护的 $redirectTo = '';

我可以动态地将每个人重定向到他的特定页面: 所以我用这种方式修改了Login控制器的构造

    public function __construct()
    {
        $this->middleware('guest')->except('logout');
        if (Auth::check()) {
            // The user is logged in...
            // Get the currently authenticated user...
            $user = Auth::user();
            $id= Auth::id();
            $userline=User::where('id',$id)->get()->last();
            if ($userline->role==='ass')
               $redirectTo ='Assistante';
       }
   }

这里是路线:

Route::get('Assistante','AssController@index');
Auth::routes();
Route::get('', 'HomeController@index')->name('home');

这里是 AssController:

class AssController extends Controller
{
      /**
     * Create a new controller instance.
     *
     * @return void
     */
      public function __construct()
      {
        $this->middleware('auth');
    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        return view('Assistante');
    }
}

但它仍然将它们重定向到同一页面。 即使我使用 protected $redirectTo = 'Assistante'; 它仍然会将我重定向到主页而不是 Assistante 页面!

我应该怎么做才能解决这个问题?

我还发现中间件中的这个类不是造成这个问题的:

class RedirectIfAuthenticated
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = null)
    {
        if (Auth::guard($guard)->check()) {
            return redirect('/home');
        }
        return $next($request);
    }
}

因为我添加了另一个中间件

class RedirectUser
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if(Auth::check())
        {
            $user = Auth::user();
            if($user->role === 'ass')
            {
             return redirect('/Assistante');
         }elseif ($user->role === 'sup')
         {
            return redirect('/Superieur');
        }elseif ($user->role === 'emp')
        {
            return redirect('/Employe');
        }
    }
    else{
     return redirect('/login');
 }
 return $next($request);
}
}

【问题讨论】:

  • 你试过使用中间件吗?
  • 就这一个 $this->middleware('guest')->except('logout');
  • 你有Assistante的路线吗?
  • 是的,我在这里是:Route::get('Assistante','AssController@index');授权::路由(); Route::get('', 'HomeController@index')->name('home');
  • Assistante 中添加路由名称以使用我的答案Route::get('Assistante','AssController@index')->name('Assistante'');

标签: laravel


【解决方案1】:

阅读有关从laravel documentation 创建中间件的信息

使用php artisan make:middleware 命令创建您自己的中间件。打开 app 目录下的中间件文件夹。在 middleware 的句柄方法中添加以下内容

    public function handle($request, Closure $next)
    {
        if(Auth::check())
        {
            $user = Auth::user();
            if($user->role === 'ass')
            {
                return redirect()->route('Assistante');
            }elseif ($user->role === 'sup')
            {
                return redirect()->route('Sup route here');
            }elseif ($user->role === 'emp')
            {
                return redirect()->route('emp route here');
            }
        }
        return $next($request);
    }

app\Http\Kernel.php 文件中注册您的中间件并将中间件添加到您选择的路由中

【讨论】:

  • 我有,但我有同样的问题。
  • 您是否创建了中间件并将其添加到 kernel.php 中?
  • 是的,我这样做:'ruser' => \App\Http\Middleware\RedirectUser::class,在受保护的 $routeMiddleware 中
  • Route::get('', 'HomeController@index')->name('home')->middleware('ruser');?
  • 我遇到了这个问题:(1/1) InvalidArgumentException Route [Assistante] 未定义。
【解决方案2】:

在您更改 redirectTo 属性的代码中,您必须访问实例变量而不是创建本地变量,即 $this->redirectTo ='Assistante'; 而不是 $redirectTo ='Assistante';

【讨论】:

  • 我这样做了,但它仍然重定向我的主页而不是 Assistante 页面。如果我使用 redirectTo 函数,我该如何使用它?
  • 你需要在当前控制器中重写该函数,它应该返回到你要重定向的页面的路由,就这么简单。
【解决方案3】:

Finnaly T 通过修改 LoginControllerRedirectIfAuthenticated 来做到这一点。

我发现我不需要创建另一个中间件,因为名为 guestRedirectIfAuthenticated 已经存在。

我所做的是:

我评论:

if (Auth::guard($guard)->check()) {
return redirect('/home');}

在句柄函数中,以便在 authenticated 函数中的登录控制器中编写我自己的逻辑。

这里是完整的解决方案:

用户表:

 public function up()
      {
      Schema::create('users', function (Blueprint $table) { 
      $table->bigInteger('id');
      $table->string('Nom',20);
      $table->string('Prenom',20);
      $table->date('DateRecrut');
      $table->string('password');
      $table->string('email',30)->unique();
      $table->char('role',3);
      $table->rememberToken();
      $table->primary('id');
      });
      }

RedirectIfAuthenticated中间件中的句柄函数

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

登录控制器:

use AuthenticatesUsers;
protected function authenticated(Request $request, $user)
  {
  if (Auth::check())
  {if($user->role === 'ass')
  return redirect('/Assistante');
  elseif ($user->role === 'sup')
  return redirect('/Superieur');
  elseif ($user->role === 'emp')
  return redirect('/Employe');
  }
  else
  return redirect('/login');
  }
  /**
  * Create a new controller instance.
  *
  * @return void
  */
  public function __construct()
  {
  $this->middleware('guest')->except('logout');
  }

最后是路线:

Auth::routes();
 Route::get('', 'HomeController@index')->name('home');
 Route::get('Assistante','AssController@index')->name('Assist‌​‌​ante');
 Route::get('Employe','EmpController@index')->name('Employe');
 Route::get('Superieur','SupController@index')->name('Superieur');

【讨论】:

    猜你喜欢
    • 2021-09-29
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 2020-02-22
    • 2014-02-03
    • 1970-01-01
    相关资源
    最近更新 更多