How to redirect to admin login page instead of login page for unauthenticated admins in laravel 5.8..15? - laravel

Does anyone know how to use guards in redirectTo() method in Authenticate middleware in laravel 5.8.15(or simply 5.8)?
I get this error
"Declaration of App\Http\Middleware\Authenticate::redirectTo($request, $guards) should be compatible with Illuminate\Auth\Middleware\Authenticate::redirectTo($request)"
use Illuminate\Support\Facades\Route;
protected function redirectTo($request, $guards)
{
if (! $request->expectsJson()) {
if (array_first($this->guards) === 'admin') {
return route('admin.login');
}
return route('login');
}
}
//Updated code but still getting error
//Error:: Declaration of App\Http\Middleware\Authenticate::handle($request,
Closure $next, $guard = NULL) should be compatible with
Illuminate\Auth\Middleware\Authenticate::handle($request, Closure $next,
...$guards)
//Code
....
use Closure;
use Illuminate\Support\Facades\Auth;
....
public function handle($request, Closure $next, $guard = null)
{
switch ($guard) {
case 'admin':
if (Auth::guard($guard)->check()) {
return redirect()->route('admin.login');
}
break;
default:
if (Auth::guard($guard)->check()) {
return redirect('/login');
}
break;
}
return $next($request);
}

CHeck like this and redirect on your condition
public function handle($request, Closure $next)
{
switch ($this->getGuard()) {
case 'admin':
if (!Auth::guard($guard)->check()) {
return redirect()->route('admin_login');
}
break;
case 'vendor':
if (!Auth::guard($guard)->check()) {
return redirect()->route('vendor_login');
}
break;
case 'user':
if (Auth::guard($guard)->check()) {
return redirect()->route('user_login');
}
break;
default:
if (Auth::guard($guard)->check()) {
return redirect('/login');
}
break;
}
return $next($request);
}

Modify the render($request, Exception $exception) in App/Exceptions/Handler.php to look like the one below:
/**
* Render an exception into an HTTP response.
*
* #param \Illuminate\Http\Request $request
* #param \Exception $exception
* #return \Illuminate\Http\Response
*/
public function render($request, Exception $exception)
{
if(get_class($exception) != 'Illuminate\Auth\AuthenticationException'){
return parent::render($request, $exception);
}
$guard = Arr::get($exception->guards(),0);
switch ($guard){
case 'admin':
return redirect(route('admin.login'));
break;
default:
return redirect(route('login'));
break;
}
}

Related

404 error page displayed when I redirecting to views through Laravel middleware

I am creating app which is contain 3 user roles which are admin, clerk and patient.
When I use middleware and when I login it displays the 404 not found error. And, when I get the 404 page, the URL is http://127.0.0.1:8000/home
I am new to laravel and I can not find where my mistake is..
User Model:
public function Patient(){
if($this->role == 0){
return true;
}else{
return false;
}
}
public function Clerk(){
if($this->role == 1){
return true;
}else{
return false;
}
}
public function Admin(){
if($this->role == 2){
return true;
}else{
return false;
}
}
constants.php
define('ADMIN',2);
define('CLERK',1);
define('PATIENT',0);
return [
'ADMIN' => 2,
'CLERK' => 1,
'PATIENT' => 0,
];
LoginController.php
class LoginController extends Controller
{
use AuthenticatesUsers;
protected $redirectTo;
public function redirectTo()
{
switch(Auth::user()->role){
case 0:
$this->redirectTo = '/patient';
return $this->redirectTo;
break;
case 1:
$this->redirectTo = '/clerk';
return $this->redirectTo;
break;
case 2:
$this->redirectTo = '/admin';
return $this->redirectTo;
break;
default:
$this->redirectTo = '/login';
return $this->redirectTo;
}
}
}
HomeController.php
class HomeController extends Controller
{
public function __construct()
{
$this->middleware('auth');
}
public function index()
{
return view('home');
}
}
Admin Middleware
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class Admin
{
public function handle(Request $request, Closure $next)
{
if (!Auth::check()) {
return redirect()->route('login');
}
if (Auth::user()->role == 0) {
return redirect()->route('patient');
}
if (Auth::user()->role == 1) {
return redirect()->route('clerk');
}
if (Auth::user()->Admin()) {
return $next($request);
}
}
}
Clerk Middleware
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class Clerk
{
public function handle(Request $request, Closure $next)
{
if (!Auth::check()) {
return redirect()->route('login');
}
if (Auth::user()->role == 0) {
return redirect()->route('patient');
}
if (Auth::user()->Clerk()) {
return $next($request);
}
if (Auth::user()->role == 2) {
return redirect()->route('admin');
}
}
}
Pateint Middleware
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class Patient
{
public function handle(Request $request, Closure $next)
{
if (!Auth::check()) {
return redirect()->route('login');
}
if (Auth::user()->Patient()) {
return $next($request);
}
if (Auth::user()->role == 1) {
return redirect()->route('clerk');
}
if (Auth::user()->role == 2) {
return redirect()->route('admin');
}
}
}
Web.php route
Route::get('/', function () {
return view('welcome');
});
Auth::routes();
Route::get('/patient', [PatientController::class, 'index'])->middleware('patient')->name('patient');
Route::get('/clerk', [ClerkController::class, 'index'])->middleware('clerk')->name('clerk');
Route::get('/admin', [AdminController::class, 'index'])->middleware('admin')->name('admin');
// Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
I am requesting you to check & notice me what to do.
Thank you very much !
Appreciate your support.
Go to App\Providers\RouteServiceProvider.php
Replace this
public const HOME = '/home';
to
public const HOME = '/';

Laravel multiple guard in blade

How make multiple watch same div to admin and manager using middleware?
Admin middleware
public function handle($request, Closure $next)
{
if(Auth::check() && Auth::user()->isRole() == "Administrator"){
return $next($request);
}
return redirect('login');
}
Manager middleware
public function handle($request, Closure $next)
{
if(Auth::check() && Auth::user()->isRole() == "Manager"){
return $next($request);
}
return redirect('login');
}
And AppServiceProvoider
public function boot()
{
Blade::if('admin', function () {
return auth()->check() && auth()->user()->role == "Administrator";
});
Blade::if('manager', function () {
return auth()->check() && auth()->user()->role == "Manager";
});
}
why not do this?
Blade::if('managerOradmin', function () {
return auth()->check() && (auth()->user()->role == "Administrator" || auth()->user()->role == "Manager");
});

redirect back to job_seeker.register

im new to laravel 5.8 im trying to set up a multiple auth but after i register a new job_seeker it suppose to redirect me to job_seeker.profile instead it redirect me back to job_seeker.register
i try some code in stackoverflow but nothing works
public function render($request, Exception $exception)
{
return parent::render($request, $exception);
}
protected function unauthenticated($request, AuthenticationException $exception)
{
if ($request->expectsJson()) {
return response()->json(['error' => 'Unauthenticated.'], 401);
}
return redirect()->guest(route($login));
}
protected function unauthenticated($request, AuthenticationException $exception)
{
if ($request->expectsJson())
{
return response()->json(['message' => $exception->getMessage()], 401);
}
$guard = array_get($exception->guards(), 0);
switch ($guard) {
case 'job_seeker':
$login = 'job_seeker.register';
break;
case 'employer':
$login = 'employer.register';
break;
default:
$login = 'login';
break;
}
return redirect()->guest(route($login));
}
Route::post('job_seeker.login',['as'=>'job_seeker.login','uses'=>'job_seeker\login_job_seeker_Controller#login']);
Route::get('job_seeker.register',['as'=>'job_seeker.register','uses'=>'job_seeker\login_job_seeker_Controller#show_login_form']);
Route::get('job_seeker.profile',['as'=>'job_seeker.profile','uses'=>'job_seeker\job_seeker_profile_controller#show_profile']);

Infinite loop in redirect to action inside a middleware

I have a middleware wrapping all routes to detect the user ip, the problem is that i make the redirect to controller action and i'm getting an infinite loop with a 302 error code.
Middleware
protected $auth;
protected $userIP;
public function __construct()
{
$this->userIP = ( !empty($_SERVER["HTTP_CF_IPCOUNTRY"]) ) ? $_SERVER["HTTP_CF_IPCOUNTRY"] : false;
$this->auth = Auth::user();
if ($this->auth->guest() || $this->auth->user()->isAnonymous()) {
$this->auth = null;
}
}
public function handle($request, Closure $next)
{
if( $this->userIP ):
$country = ($this->userIP == "US") ? "USA" : (($this->userIP == "CA") ? "CANADA" : (($this->userIP == "CN") ? "CHINA" : (($this->userIP == "PA") ? "PANAMA" : (($this->userIP == "GT") ? "GUATEMALA" : "MX"))));
switch($country)
{
case "USA":
return redirect()->away('http://mysiteusa.com/');
break;
case "GUATEMALA":
return redirect()->action('Site\SwitchCountryController#update', ['key' => 8]);
break;
}
endif;
return $next($request);
}
Controller
public function update($clave)
{
$newSucursal = Sucursal::firstOnCountry($key);
if (! $newSucursal) {
return back();
}
user()->setStore($newSucursal);
return redirect('/products');
}
I'm a little lost about how to fix this, any idea?
Regards!

middleware not executing after successful login

AdminMiddleware:
public function handle($request, Closure $next)
{
return $next($request);
if (\Auth::user() && \Auth::user()->isAdmin() == 1) {
return view('adminpage');
} else {
return view('homepage');
}
}
}
User.php:
public function isAdmin() {
return $this->is_admin;
}
UserController.php:
public function login(Request $request)
{
$email = $request->email;
$password = $request->password;
if(\Auth::attempt(['email'=>$email, 'password'=>$password])) {
// i dont know what if successfull login, i need to execute the logic written in AdminMiddleware
} else {
return view('login);
}
}
My table contains a boolean field "is_admin" with 1 for xxx#gmail.com

Resources