У меня есть система маршрутов в laravel, что защищают пользователей guests ввождения admin dashboard, проблема состоит в том, что я только могу блокировать посетителей и не "нормальных" пользователей (А именно пользователи, которые покупают вещи, посетители не могут покупать).
Попробуйте делать middleware, который блокирует их, но не функционирует хорошо, мне хотелось бы знать, как упорядочивать это.
Это маршрут, который я хочу защитить
Route::get('/admin', [
'uses' => 'AdminController@getAdmin',
'as' => 'admin.dashboard',
'middleware' => 'auth', 'admin' //Es el modulo de entrar al admin, solo usuarios registrados lo pueden usar
]);
middleware auth, который приходит из-за default в одиноком Laravel, удается защитить dashboard пользователей, не зарегистрированных, а именно пользователь, который зарегистрировался обычно, может входить когда пишут url и я нуждаюсь в том, чтобы уклониться от этого, но не как
Это мой код, вводят пользователи, используя в UserController, если они нуждаются в информации об этом
<?php
namespace App\Http\Controllers;
use App\User;
use Illuminate\Http\Request;
use App\Http\Requests;
use Auth;
use Redirect;
class UserController extends Controller
{
public function getSignup(){
return view('user.signup'); //Manda al usuario al signup
}
public function postSignup(Request $request){ //Crear el usuario
$this->validate($request, [
'email' => 'email|required|unique:users',
'password' => 'required|min:4'
]); //Valida al usuario deacuerdo si es unico y su clave es mayor a 4
$user=new User([
'email' => $request->input('email'),
'password' => bcrypt($request->input('password')),
]);
$user->save(); //Salva al usuario
Auth::login($user); //Arranca la sesion
return redirect()->route('user.profile');
}
public function getSignin(){
return view('user.signin');
}
public function postSignin(Request $request){ //Inicio de sesion
$this->validate($request, [
'email' => 'email|required',
'password' => 'required|min:4'
]); //Valida los campos
if(Auth::attempt(['email' => $request->input('email'), 'password' => $request->input('password'), 'type' => 'cliente'])){
return redirect()->route('user.profile');
} //Valida si el usuario es un cliente
if(Auth::attempt(['email' => $request->input('email'), 'password' => $request->input('password'), 'type' => 'admin'])){
return redirect()->route('admin.dashboard');
} //Valida si el usuario es un admin
return redirect()->back();
}
public function getProfile(){
return view('user.profile');
}
public function getLogout(){
Auth::logout();
return redirect()->route('product.index');
}
}
Это код, который у меня есть в Миддлеваре де Аутентикатион
<?php
namespace App\Http\Middleware;
use Illuminate\Auth\Middleware\Authenticate as Middleware;
class Authenticate extends Middleware
{
/**
* Get the path the user should be redirected to when they are not authenticated.
*
* @param \Illuminate\Http\Request $request
* @return string
*/
protected function redirectTo($request)
{
if (! $request->expectsJson()) {
return route('user.signin');
}
}
}
Это - то, что у меня есть в AdminMiddleware
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
use Redirect;
class AdminMiddleware
{
/**
* Handel an Incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure
* @return mixed
*/
public function handle($request, Closure $next)
{
if(Auth::user()->type == 'admin')
{
return redirect()->route('admin.dashboard');
}
else
{
return redirect('product.index');
}
}
}
Это - то, что у меня есть в Kernel.php, middleware, если он инициализировался
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
/**
* The application's global HTTP middleware stack.
*
* These middleware are run during every request to your application.
*
* @var array
*/
protected $middleware = [
\App\Http\Middleware\TrustProxies::class,
\App\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:60,1',
'bindings',
],
];
/**
* The application's route middleware.
*
* These middleware may be assigned to groups or used individually.
*
* @var array
*/
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
'admin' => \App\Http\Middleware\AdminMiddleware::class,
];
/**
* The priority-sorted list of middleware.
*
* This forces non-global middleware to always be in the given order.
*
* @var array
*/
protected $middlewarePriority = [
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\Authenticate::class,
\Illuminate\Routing\Middleware\ThrottleRequests::class,
\Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\Illuminate\Auth\Middleware\Authorize::class,
\Illuminate\Auth\Middleware\Authorize::class,
\App\Http\Middleware\AdminMiddleware::class,
];
}
Так это что, как у меня есть таблица users, по какому-то разуму AdminMiddleware оно не общается с нею, или не знает, как делать это
CREATE TABLE `users` (
`id` bigint(20) UNSIGNED NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
`email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`type` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'cliente',
`remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;