我是laravel的新手,我创建了3种用户
在用户表中,我添加了一个名为 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);
}
}
答案 0 :(得分:1)
使用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
文件中注册中间件,并将中间件添加到您选择的路径中
答案 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('Assistante');
Route::get('Employe','EmpController@index')->name('Employe');
Route::get('Superieur','SupController@index')->name('Superieur');