2017-07-19 165 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 –

    相关问题