2017-07-19 172 views
1

如果我去http://www.yourdomain.com/admin/login,我會看到我的登錄頁面。當用戶未登錄時,Laravel重定向到特定路線

如果我去http://www.yourdomain.com/admin/example我沒有管理員重定向到http://www.yourdomain.com/login

我的網絡路線:

Auth::routes(); 

Route::prefix('admin')->group(function() { 
    Route::get('/login','Auth\[email protected]')->name('admin.login'); 
    Route::post('/login','Auth\[email protected]')->name('admin.login.submit'); 
    Route::get('/manifiesto','[email protected]')->name('admin.dashboard'); 
    Route::get('/logout','Auth\[email protected]')->name('admin.logout'); 
    Route::get('/trabajadores','[email protected]')->name('admin.trabajadores'); 
    Route::get('/clientes','[email protected]')->name('admin.clientes'); 
    Route::get('/proyectos','[email protected]')->name('admin.proyectos'); 
    Route::get('/administradores','[email protected]')->name('admin.administradores'); 
}); 

當我把一些網址與/管理員之前用戶沒有登錄,我想重定向到/管理/登錄。

謝謝。

更多信息:

應用程序/ HTTP /控制器/認證/ AdminLoginController.php

<?php 

namespace App\Http\Controllers\Auth; 

use App\Http\Controllers\Controller; 
use Illuminate\Foundation\Auth\AuthenticatesUsers; 
use Auth; 
class AdminLoginController extends Controller 
{ 

    protected $loginPath = 'admin/login'; 

    public function __construct() 
    { 
     $this->middleware('guest:admin', ['except' => ['logout']]); 
    } 
    public function showLoginForm() 
    { 
     return view('backend.public.pages.login'); 
    } 
    public function login(Request $request) 
    { 
     //validate the form data 
     $this->validate($request, [ 
      'email' => 'required|email', 
      'password' => 'required|min:6' 
     ]); 
     //attempt to log the user in 
     if (Auth::guard('admin')->attempt(['email' => $request->email, 'password' => $request->password], $request->remember)){ 
      //if successful, then redirect to their intended location 
      return redirect()->intended(route('admin.dashboard')); 
     } 
     return redirect()->back()->withInput($request->only('email','remember')); 
    } 

    public function logout() 
    { 
     Auth::guard('admin')->logout(); 

     return redirect('/'); 
    } 
} 

應用程序\ HTTP \中間件\ AdminAuthenticate.php

<?php 

namespace App\Http\Middleware; 

use Closure; 
use Illuminate\Support\Facades\Auth; 

class AdminAuthenticate 
{ 
/** 
* Handle an incoming request. 
* 
* @param \Illuminate\Http\Request $request 
* @param \Closure $next 
* @param string|null $guard 
* @return mixed 
*/ 
public function handle($request, Closure $next) 
{ 
    if ($this->auth->guest()) 
    { 
     if ($request->ajax()) 
     { 
      return response('Unauthorized.', 401); 
     } 
     else 
     { 
      return redirect()->guest('admin/login'); // <--- here 
     } 
    } 

    return $next($request); 
} 
} 
+2

到每一個管理控制器的構造函數中添加新的中間件試試這個'路線:: (['prefix'=>'admin','middleware'=>'auth'],函數() {....});' – Maraboc

+0

同樣的問題,我有重定向到/ login –

+0

是否有其他登錄路線或JUST'管理員/登錄'? – Maraboc

回答

1
  1. 創建中間件
 
php artisan make:middleware AuthAdmin 
  • 檢查旅客在中間件的handle方法
  •  
    public function handle($request, Closure $next) 
    { 
        if (Auth::guest()) { 
         if ($request->ajax() || $request->wantsJson()) { 
          return response('Unauthorized.', 401); 
         } else { 
          return redirect()->guest('admin/login'); 
         } 
        } 
    
        return $next($request); 
    } 
    
  • 添加一鍵中間件在app/Http/Kernel.php$routeMiddleware陣列
  •  
    'auth_admin' => \App\Http\Middleware\AuthAdmin::class 
    
  • 附加auth_admin中間件組
  •  
    Route::group(['prefix' => 'admin', 'middleware' => 'auth_admin'], function() { 
        // Your admin routes except login 
    }); 
    
    +0

    如果我將您的代碼替換爲我的代碼,則發生同樣的錯誤,所有路由都將轉到/ login not/admin/login。而www.mydomain.com/admin/login也會重定向到/ login。 –

    +0

    同樣的錯誤。如果我把/管理員/登錄錯誤:Class'App \ Http \ Middleware \ Auth'找不到 –

    0

    寫婁代碼在你route.php文件

    Route::group(array('prefix' => 'admin'), function() { 
         Route::controller('login', 'AdminloginController'); 
        }); 
        Route::group(array('before' => 'admin_ajax', 'prefix' => 'admin'), function() 
        { 
         //route for pages which are render after login 
        }); 
        Route::get('/admin', function() { 
         return View::make('admin.loginform'); 
        }); 
    

    而在你filter.php文件寫婁代碼

    Route::filter('admin_ajax', function() { 
        if (!Auth::admin()->check()) { 
         return Redirect::to('admin/login'); 
        } else { 
        } 
    }); 
    

    而且如果你正在使用laravel 5.4

    Route::get('/manage', function() { 
        return redirect('manage/login'); 
    }); 
    Route::group(['prefix' => 'manage'], function() { 
        //login bypass for the below listed controllers  
        Route::resource('login', '[email protected]'); 
        Route::post('dologin', '[email protected]'); 
    }); 
    
    +0

    我使用laravel 5.4,所以我編輯web.php中的第一個代碼和第二個文件? –

    +0

    如果您使用的是laravel 5.4,那麼您必須定義中間件 – Margi

    0

    所有你能做的就是添加auth中間件這樣的:

    Route::group(['prefix' => 'admin', 'middleware' => 'auth'], function() { 
        Route::get('/login','Auth\[email protected]')->name('admin.login'); 
        Route::post('/login','Auth\[email protected]')->name('admin.login.submit'); 
        Route::get('/manifiesto','[email protected]')->name('admin.dashboard'); 
        Route::get('/logout','Auth\[email protected]')->name('admin.logout'); 
        Route::get('/trabajadores','[email protected]')->name('admin.trabajadores'); 
        Route::get('/clientes','[email protected]')->name('admin.clientes'); 
        Route::get('/proyectos','[email protected]')->name('admin.proyectos'); 
        Route::get('/administradores','[email protected]')->name('admin.administradores'); 
    }); 
    

    但默認情況下,這將重定向到/login,如果要覆蓋這一點,你必須取決於如果您有其他類型的用戶在兩個chocies使用/login路由或不!

    • 如果沒有人使用/login路線

    1你需要修改App\Http\Middleware\Authenticate::handle()方法,改變/loginadmin/login

    2-然後您需要將$loginPath屬性添加到您的\App\Http\Controllers\Auth\AuthController類。

    身份驗證

    namespace App\Http\Middleware; 
    class Authenticate { 
         /** 
        * Handle an incoming request. 
        * 
        * @param \Illuminate\Http\Request $request 
        * @param \Closure $next 
        * @return mixed 
        */ 
        public function handle($request, Closure $next) 
        { 
         if ($this->auth->guest()) 
         { 
          if ($request->ajax()) 
          { 
           return response('Unauthorized.', 401); 
          } 
          else 
          { 
           return redirect()->guest('admin/login'); // <--- here 
          } 
         } 
    
         return $next($request); 
        } 
    } 
    

    AuthController

    namespace App\Http\Controllers\Auth; 
    class AuthController extends Controller 
    { 
        protected $loginPath = 'admin/login'; // <--- here 
    
        // ... other properties, constructor, traits, etc 
    } 
    
    • 如果有一個人在使用/login路線

    您必須創建您自己的middleware,做什麼需要身份驗證檢查的handle法重定向到您的admin/liging路線:)

    在這種情況下:

    1. 添加以下行$routeMiddleware酒店在app/Http/Kernel.php文件

      'adminAuth' => \App\Http\Middleware\YourNewMiddleware::class, 
      
    2. 不要忘記添加新的中間件路由組作爲跟隨

      Route::group(['prefix' => 'admin', 'middleware' => 'adminAuth'], function() 
      { 
          // your admin routes 
      }); 
      
    +0

    您好maraboc,我編輯我的問題與您在答案中說的文件的信息。當我編輯它時,我有同樣的錯誤。 –

    +0

    試試這個'return redirect() - > route('admin.login'); // <---在這裏! – Maraboc

    +0

    @LluísPuigFerrer爲您工作? – Maraboc

    0

    讓一個又一箇中間件管理。按照循序漸進

    1. 做一個在app/Http/Middleware位置的名爲AdminAuthenticate文件,複製身份驗證的新文件中的內容 修改類的名稱AdminAuthenticate

    2. 更改手柄功能的下方

      內容作爲節目
      public function handle($request, Closure $next, $guard = null) 
      { 
          if (Auth::guard($guard)->guest()) { 
           if ($request->ajax()) { 
            return response('Unauthorized.', 401); 
           } else { 
            return redirect()->guest('/admin/login'); 
           } 
          } 
      
          return $next($request); 
      } 
      
    3. 添加以下行$routeMiddleware array app/Http/Kernel.php file

      'AdminAuth' => \App\Http\Middleware\AdminAuthenticate::class, 
      
    4. 現在一切正常。只需添加新的中間件航線組爲遵循

      Route::group(['prefix' => 'admin', 'middleware' => 'AdminAuth'], function() 
      { 
          // all admin routes 
      }); 
      

      或者你可以像下面

      $this->middleware('AdminAuth');

    +0

    我編輯了我的文件,您可以檢查答案。與以前相同的錯誤。 –

    +0

    請再次仔細閱讀我的回答。完成中間件後,爲管理面板添加新的中間件。在每個管理控制器的構造函數中添加$ this->中間件('AdminAuth')@LluísPuigFerrer –

    相關問題