Php 所有页面的Laravel身份验证检查

Php 所有页面的Laravel身份验证检查,php,authentication,laravel,Php,Authentication,Laravel,我已经创建了身份验证,它工作得非常好。但是在检查内部页面时存在一些问题。比如说, Route::get('/', array('before' => 'auth' , 'do'=> function(){ return View::make('home.index'); })); 索引页仅对登录用户可见。但是每当我进入内部页面时,例如example.com/products。产品页面无需登录即可显示。只需在您的视图中检查用户是否已登录即可。 或限制所有控制器(如果使用) 或者检查路

我已经创建了身份验证,它工作得非常好。但是在检查内部页面时存在一些问题。比如说,

Route::get('/', array('before' => 'auth' , 'do'=> function(){
return View::make('home.index');
}));

索引页仅对登录用户可见。但是每当我进入内部页面时,例如
example.com/products
。产品页面无需登录即可显示。

只需在您的视图中检查用户是否已登录即可。 或限制所有控制器(如果使用)
或者检查路由组,并为整个路由组提供一个筛选器:

有几种方法可以为许多路由应用筛选器

将rotues放入
Route::group()
中,或者如果您使用控制器,请在那里添加过滤器,将其添加到
Base\u控制器中,以便将其应用于所有。您还可以使用过滤器模式和正则表达式,该正则表达式将过滤器应用于除少数您不想应用的过滤器之外的所有对象

文档

路由筛选器:

模式过滤器的示例,其他示例基本上都在文档中。这可能是最快的,但也是最有问题的,因为在这个函数中注册正则表达式的方法有问题(
*
实际上被转换成
(.*)

Route::filter('pattern:^(?!login)*','auth');

这将auth应用于除
example.com/login

之外的任何路由。可能有更好的方法,但我采用白名单方法。除了我在这个数组中放置的页面之外,所有内容都被阻止公开

Route::filter('pattern: /*', array('name' => 'auth', function()
{
  return View::make('home.index');
}));
 // config/application.php   
 return array(

    'safe' => array(
        '/',
        'card/form_confirm',
        'record/form_create',
        'card/form_viewer',
        'user/login',
        'user/quick_login',
        'user/register',
        'info/how_it_works',
        'info/pricing',
        'info/faq',
        'info/our_story',
        'invite/accept',
        'user/terms',
        'user/privacy',
        'email/send_email_queue',
        'user/manual_login',
        'checkin/',
        'checkin/activate',
        'system/list',
    ),

// routes.php
Route::filter('before', function()
{
    // Maintenance mode
    if(0) return Response::error( '503' );

    /*
        Secures parts of the application
        from public viewing.
    */
    $location = URI::segment(1) . '/' . URI::segment(2);
    if(Auth::guest() && !in_array( $location, Config::get('application.safe')))
        return Redirect::to( 'user/login' );
});
这是我的解决办法

/**
 * Groups of routes that needs authentication to access.
 */
Route::group(array('before' => 'auth'), function() 
{
    Route::get('user/logout', array(
        'uses' => 'UserController@doLogout',
    ));

    Route::get('/', function() {
        return Redirect::to('dashboard');
    });

    Route::get('dashboard',  array(
        'uses' => 'DashboardController@showIndex',
    ));

    // More Routes

});

// Here Routes that don't need Auth.

这对我有用。看一看

Route::when('*', 'auth.basic');

Route::get('api/getactorinfo/{actorname}', array('uses' =>'ActorController@getActorInfo'));
Route::get('api/getmovieinfo/{moviename}', array('uses' =>'MovieController@getMovieInfo'));
Route::put('api/addactor/{actorname}', array('uses' =>'ActorController@putActor'));
Route::put('api/addmovie/{moviename}/{movieyear}', array('uses' =>'MovieController@putMovie'));
Route::delete('api/deleteactor/{id}', array('uses' =>'ActorController@deleteActor'));
Route::delete('api/deletemovie/{id}', array('uses' =>'MovieController@deleteMovie'));
请阅读文档页面上的更多内容:

这段代码对我来说很好

Auth::routes();

Route::group(['middleware' => 'auth'], function () {
    // Authentication Routes...
    Route::get('/', 'HomeController@index')->name('home');

});

使用BaseController扩展所有控制器必须记录的用户,同样的问题也可以解决

例如:

class SomeController extends BaseController
{
    public function index() { return view('some.index');}
}
只需向BaseController添加一个
\u construct()
方法

class BaseController extends Controller
{
    protected $redirectTo = '/myIndex'; // Redirect after successfull login

    public function __construct()
    {
        $this->middleware('auth'); // force all controllers extending this to pass auth
    }
}

更多信息

是的,我能做到。问题是我有很多内页。无法检查所有页面。应该有一个简单的解决方案Route Group是应用过滤器来实现这一点的理想选择,但我不建议在视图级别这样做作为一个可行的替代方案-它没有足够早地启动(即,在开始渲染视图之前,
POST
仍可能产生效果,然后将用户踢出),简单但有效,不是吗?
class BaseController extends Controller
{
    protected $redirectTo = '/myIndex'; // Redirect after successfull login

    public function __construct()
    {
        $this->middleware('auth'); // force all controllers extending this to pass auth
    }
}