如何将身份验证的用户重定向到特定页面

时间:2017-09-11 15:51:36

标签: laravel

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

  1. sup有一个名为sup
  2. 的视图
  3. ass有一个叫做屁股的视图
  4. emp有一个名为emp的视图
  5. 在用户表中,我添加了一个名为 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();
            });
        }
    

    我希望当每个人都认证时,他会被重定向到他的特定视野,所以我想如果我可以改变

    的价值

    protected $ 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);
    }
    }
    

3 个答案:

答案 0 :(得分:1)

了解如何从laravel documentation

创建中间件

使用php artisan make:middleware命令创建自己的中间件。打开app目录中的中间件文件夹。将以下内容添加到middleware

的handle方法中
    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文件中注册中间件,并将中间件添加到您选择的路径中

答案 1 :(得分:0)

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

答案 2 :(得分:0)

Finnaly T通过修改 LoginController RedirectIfAuthenticated 来实现这一目标。

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

我所做的是:

我发表评论:

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

在句柄函数中,以便在经过身份验证的函数的Login控制器中编写自己的逻辑。

以下是完整的解决方案:

用户表:

 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);
     } 

LoginController:

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');