Php 仅使用两个中间件的Multi-Auth Laravel 5.4
我想创建两个中间件来重定向经过身份验证的用户,如果它是管理员,它将重定向到后台,否则它将重定向到简单用户的简单仪表板 但是我只想使用users表,而不想为管理员添加另一个表 RedirectIfAuthenticated.phpPhp 仅使用两个中间件的Multi-Auth Laravel 5.4,php,laravel,authentication,laravel-5,laravel-middleware,Php,Laravel,Authentication,Laravel 5,Laravel Middleware,我想创建两个中间件来重定向经过身份验证的用户,如果它是管理员,它将重定向到后台,否则它将重定向到简单用户的简单仪表板 但是我只想使用users表,而不想为管理员添加另一个表 RedirectIfAuthenticated.php <?php class RedirectIfAuthenticated { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @para
<?php
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()) {
if (Auth::user()->role_id == 1)
{
return redirect('/admin/home');
}
return redirect('/dashboard');
}
return $next($request);
}
}
web.php
Route::get('/us-admin', function () { return redirect('/admin/home'); })->name('admin.dashboard');
// Authentication Routes...
$this->get('login', 'Auth\LoginController@showLoginForm')->name('auth.login');
$this->post('login', 'Auth\LoginController@login')->name('auth.login');
$this->post('register', 'Auth\RegisterController@register')->name('auth.register');
$this->post('logout', 'Auth\LoginController@logout')->name('auth.logout');
// Change Password Routes...
$this->get('change_password', 'Auth\ChangePasswordController@showChangePasswordForm')->name('auth.change_password');
$this->patch('change_password', 'Auth\ChangePasswordController@changePassword')->name('auth.change_password');
// Password Reset Routes...
$this->get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('auth.password.reset');
$this->post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('auth.password.reset');
$this->get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
$this->post('password/reset', 'Auth\ResetPasswordController@reset')->name('auth.password.reset');
Route::group(['middleware' => ['auth'], 'prefix' => 'admin', 'as' => 'admin.'], function () {
Route::get('/home', 'HomeController@index');
});
Route::get('/dashboard', 'DashboardController@index');
在这种情况下,您需要建立用户角色,或者在用户表上为is_admin设置一个可选的布尔字段。然后在中间件中,它将简单地类似于:
class RedirectIfNotAdmin
{
/**
* 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::user()->admin()) {
return redirect()->to('user-dashboard');
}
return $next($request);
}
}
因此,在您的案例中,我将为每个角色创建一个单独的中间件,用于发布授权。然后,您可以将AdminMiddleware应用于前缀为“admin”的所有路由,将SimpleUserMiddleware应用于所有其他路由,例如。您只需检查
重定向验证的
中间件中的角色,默认情况下这些角色已经存在,并通过创建管理中间件来限制路由
在app/Http/Middleware/RedirectIfAuthenticated.php中
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
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()) {
if (Auth::user()->role_id == 1)
{
return redirect('/admin/home');
}
return redirect('/dashboard');
}
return $next($request);
}
}
<?php
namespace App\Http\Middleware;
use Closure;
use Auth;
class AuthenticateAdmin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (!Auth::check() || Auth::user()->role_id != 1)
{
if ($request->ajax())
{
return response('Unauthorized.', 401);
}
else
{
return redirect()->guest('login');
}
}
return $next($request);
}
}
Route::middleware('admin')->prefix('admin')->group(function() {
Route::get('/home', 'HomeController@index')->name('admin.home');
});
在app/Http/Kernal.php
中,将这一行添加到$routeMiddleware
数组中
'admin' => \App\Http\Middleware\AuthenticateAdmin::class,
在routes/web.php中
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
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()) {
if (Auth::user()->role_id == 1)
{
return redirect('/admin/home');
}
return redirect('/dashboard');
}
return $next($request);
}
}
<?php
namespace App\Http\Middleware;
use Closure;
use Auth;
class AuthenticateAdmin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (!Auth::check() || Auth::user()->role_id != 1)
{
if ($request->ajax())
{
return response('Unauthorized.', 401);
}
else
{
return redirect()->guest('login');
}
}
return $next($request);
}
}
Route::middleware('admin')->prefix('admin')->group(function() {
Route::get('/home', 'HomeController@index')->name('admin.home');
});
在app/Http/Controllers/Auth/LoginController.php中添加此函数
protected function authenticated(Request $request, $user)
{
if ($user->role_id == 1) {
return redirect()->intended(route('admin.home'));
}
return redirect()->intended(route('dashboard'));
}
希望这能帮助你简单地称呼你的用户不会为你赢得任何朋友:)说真的,除了一个好主意之外,到目前为止你还得到了什么?你被困在哪里?你面临什么问题?谢谢@Dale,我已经有了一个管理员的后台办公室,现在我想如果用户想通过我网站的前端进行身份验证,它将被重定向到一个小的后台办公室,带有个人资料和其他元素。我不希望用户访问管理员的后台办公室。只需制作一个列来存储用户角色(admin,super admin,user)@HoángĐng已经完成了,问题是中间件上的测试不起作用。我已经设置了角色管理,在users表中有一个外键和“roleėid”字段,但我已经尝试为简单用户创建一个middlware,但它不起作用,但如何创建?!您可以帮助PleaseCreall使用此工具吗?如果您将其应用于组中的所有路由,它将从内部页面重定向到角色主页。这不是用于应用于每个路由的中间件,它是默认的mid当您通过身份验证时进行检查的软件。若要应用所有路由,您必须创建另一个简单的管理中间件i将我重定向到未找到的页面/home和/admin/home在本例中只是占位符,您必须为它们设置路由。我知道,我设置了自己的路由,但它不起作用,我认为它没有检查角色\u id