我有三种不同类型用户的Laravel 5.3。我希望在登录后将它们重定向到不同的仪表板页面。例如:
用户 - >登录 - >用户的仪表板
admin - >登录 - >管理员的仪表板
我创建了一个名为CheckRole
的中间件:
public function handle($request, Closure $next)
{
if($request->user() === null) {
return response("Insufficient Permissions" , 401);
}
$actions = $request->route()->getAction();
$roles = isset($actions['roles']) ? $actions['roles'] : null;
if($request->user()->hasAnyRole($roles) || !$roles) {
return $next($request);
}
return response("Insufficient Permissions" , 401);
}
路线
Route::group(['middleware' => ['auth','roles'], 'roles' => 'Admin'], function () {
// Routes here
}
角色运作完美。
redirectTo= '';
中的LoginContoller
仅指向一个视图。我已经检查了文档,我相信这与守卫有关,而后卫没有解释如何设置它。
我也看过multiauth,但我不认为为不同的用户创建不同的表并因此寻找替代答案是明智的。
任何建议都将不胜感激。
我的表格如下:
Table users
id | name | email
---------
1 | John | john@blah.com
2 | Michael | michael@blah.com
Table roles
id | name
---------
1 | Admin
2 | PrivilegedMember
3 | Subscriber
Table user_role
id | user_id | role_id
----------------------
1 | 1 | 1
2 | 2 | 2
这可能与以下问题重复,但提供的答案不会解释多个重定向。
答案 0 :(得分:2)
使用Traits的最佳方法(我已经发现)。我们要做的是低音相同但不那么复杂和结构化:
1。我们的用户模型不会创建两个表,而是会有一个角色字段,在我的情况下,我会有:' admin','雇员'和'用户'。
2. 我们将创建一个Traits文件夹,在这种情况下,它将被放置在App/Http
。
3。我们将创建一个新文件,并在该文件夹中使用此内容将其命名为RedirectTrait.php
:
<?php
namespace App\Http\Traits; // Or the place where the trait is stored (step 2)
use Illuminate\Http\Request;
trait RedirectTrait
{
/**
* Where to redirect users after register/login/reset based in roles.
*
* @param \Iluminate\Http\Request $request
* @param mixed $user
* @return mixed
*/
public function RedirectBasedInRole(Request $request, $user) {
$route = '';
switch ($user->role) {
# Admin
case 'admin':
$route = '/admin/dashboard/route'; // the admin's route
break;
# Employee
case 'employee':
$route = '/employee/dashboard/route'; // the employee's route
break;
# User
case 'user':
$route = '/user/dashboard/route'; // the user's route
break;
default: break;
}
return redirect()->intended($route);
}
}
正如您所看到的,我们可以“玩”&#39;与重定向,但意图是必要的根据laravel文档:
重定向器上的预期方法将用户重定向到他们在被身份验证中间件拦截之前尝试访问的URL。如果目标目的地不可用,则可以为此方法提供回退URI。
4。最后,我们会调整特征并将其调用:
App/Http/Controllers/Auth/LoginController.php
档案 use Illuminate\Http\Request; // Add
use App\Http\Traits\RedirectTrait; // Call the trait
class LoginController extends Controller
{
...
use RedirectTrait; // Use the trait
/**
* The user has been authenticated.
*
* @param \Illuminate\Http\Request $request
* @param mixed $user
* @return mixed
*/
protected function authenticated(Request $request, $user)
{
return $this->RedirectBasedInRole($request, $user);
}
...
}
我们会覆盖经过身份验证的&#39;方法放在Illuminate\Foundation\Auth\AuthenticatesUsers
(顺便说一句是空的)
App/Http/Controllers/Auth/RegisterController.php
文件中执行相同操作,但该方法自然会有不同的名称:/**
* The user has been registered.
*
* @param \Illuminate\Http\Request $request
* @param mixed $user
* @return mixed
*/
protected function registered(Request $request, $user)
{
return $this->RedirectBasedInRole($request, $user);
}
我们会覆盖重定向的&#39;方法存储在Illuminate\Foundation\Auth\RegistersUsers
中,也是空的。
5. :享受:D
PS。重置密码重定向是另一个历史记录。
答案 1 :(得分:0)
看起来下面的解决方案超过了整个过程并完成了工作。但我不认为这是正确的方式,因为我们正在修改Core文件。有些人请注意这个。
转到AuthenticatesUser.php特征。
找到SendLoginResponse(请求$请求)
在返回默认路径之前添加条件。我已将其更改为
protected function sendLoginResponse(Request $request)
{
$request->session()->regenerate();
$this->clearLoginAttempts($request);
if(Auth::User()->hasRole('Admin')) {
return redirect()->intended('admin');
} elseif (Auth::User()->hasRole('PrivilegedMember')) {
return redirect()->intended('PriviligedMember/index');
}
return $this->authenticated($request, $this->guard()->user())
?: redirect()->intended($this->redirectPath());
}
答案 2 :(得分:0)
LoginController.php
protected function authenticated(Request $request, $user)
{
if($user->id_role == 1) {
return redirect()->intended('/admin');
}
if ($user->id_role != 1) {
return redirect()->intended('/user');
}
}