【问题标题】:Laravel auth check for all pagesLaravel 身份验证检查所有页面
【发布时间】:2012-11-24 14:48:03
【问题描述】:

我已经创建了身份验证,并且它运行良好。但是检查内页有一些问题。例如,

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

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

【问题讨论】:

    标签: php authentication laravel


    【解决方案1】:

    这是我的解决方案。

    /**
     * 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.
    

    【讨论】:

    • 简单但有效,不是吗?
    【解决方案2】:

    有几种方法可以为许多路由应用过滤器。

    将 rotues 放入 Route::group() 或者如果您使用控制器在此处添加过滤器,请将其添加到 Base_Controller 中,以便将其应用于所有人。您还可以使用过滤器模式并使用正则表达式,它将过滤器应用于除少数您不想要的之外的所有人。

    文档

    路由过滤器:http://laravel.com/docs/routing#route-filters

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

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

    这会将身份验证应用于除example.com/login 之外的任何路由。

    【讨论】:

      【解决方案3】:
      Route::group(['middleware' => ['auth']], function()
      {
          Route::get('list', 'EventsController@index');     
      });
      

      在文档页面上阅读更多信息: https://laravel.com/docs/5.2/routing#route-groups

      【讨论】:

        【解决方案4】:

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

         // 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' );
        });
        

        【讨论】:

          【解决方案5】:

          这段代码很适合我

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

          【讨论】:

            【解决方案6】:

            只需检查用户是否在您的视图中登录。 或限制所有控制器(如果您使用它) 或者检查 Route Groups,并对整个路由组进行过滤:http://laravel.com/docs/routing#groups

            【讨论】:

            • 是的,我能做到。问题是我有很多内页。无法检查所有页面。应该有一个简单的解决方案
            • 路由组是应用过滤器来实现这一目标的理想选择,但我不建议在视图级别将其作为可行的替代方案 - 它不够早(即 POST 可以在开始渲染视图之前仍然有效果,然后将用户踢出)
            【解决方案7】:
            Route::filter('pattern: /*', array('name' => 'auth', function()
            {
              return View::make('home.index');
            }));
            

            【讨论】:

              【解决方案8】:

              同样的问题可以通过使用 BaseController 来扩展所有 Controller 必须登录的用户来解决。

              例子:

              class SomeController extends BaseController
              {
                  public function index() { return view('some.index');}
              }
              

              只需向 BaseController 添加一个__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
                  }
              }
              

              更多信息here

              【讨论】:

                【解决方案9】:

                它对我有用。看看吧。

                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'));
                

                【讨论】:

                  猜你喜欢
                  • 2016-03-16
                  • 1970-01-01
                  • 2013-04-04
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-05-30
                  • 2014-12-20
                  • 2020-01-26
                  • 1970-01-01
                  相关资源
                  最近更新 更多