我正在使用Laravel-5.1中的角色构建自定义身份验证系统。
我有两组用户,主管和管理员。但我只有一个登录页面。因此,当用户登录时,它首先验证他们的凭据,然后我编写了一个中间件来检查他们是哪种用户。
如果他们是管理员,则应将其重定向到/admin/home
。如果他们是主管,则应将其重定向到supervisor/home
。
我可以从源文件Illuminate/Foundation/Auth/RedirectsUsers.php
看到默认重定向是/home
。但是,我怎样才能改变它以使它变得动态?
我的路线档案:
/* Administrator Routes */
Route::group(['namespace' => 'Admin', 'middleware' => 'timesheets.admin:1'], function()
{
return Route::get('admin/home', 'AdminController@index');
});
/* Supervisor Routes */
Route::group(['namespace' => 'Supervisor', 'middleware' => 'timesheets.supervisor:2'], function()
{
return Route::get('supervisor/home', 'SupervisorController@index');
});
我的中间件文件:
<?php
namespace App\Http\Middleware\Auth;
use Closure, App;
use Illuminate\Contracts\Auth\Guard;
class AdminAuthenticate
{
/**
* The Guard implementation.
*
* @var Guard
*/
protected $auth;
/**
* Create a new filter instance.
*
* @param Guard $auth
* @return void
*/
public function __construct(Guard $auth)
{
$this->auth = $auth;
}
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next, $role)
{
if ($this->auth->guest()) {
if ($request->ajax()) {
return response('Unauthorized.', 401);
} else {
return redirect()->guest('login');
}
}
/* Get user id */
$userId = $this->auth->user()->userId();
if (auth()->check() && auth()->user()->hasRole($userId, $role)) {
return $next($request);
}
else
{
App::abort(403);
}
}
}
答案 0 :(得分:4)
首先,在您的AuthController中设置$redirectPath
,如:
$redirectPath = 'Path/to/standard/user/on/authentication'
创建一个名为Admin的新中间件,如下所示:
public function handle($request, Closure $next)
{
if ( Auth::check() && Auth::user()->isAdmin() )
{
return redirect('path/to/admin');
}
return $next($request);
}
您需要在用户模型中创建一个新方法来检查管理员。
像这样:
public function isAdmin()
{
return $this->admin;
}
这会在您的用户表格中返回您的管理字段的值。
然后在SupervisorController
__construct()
上,您可以调用您的管理中间件:
public function __construct()
{
$this->middleware('admin');
}
这将使管理员登陆标准登录,但几乎立即将他们重定向到管理员家。