如何阻止相同类型的用户访问Laravel中的其他数据?

时间:2015-03-31 07:21:21

标签: php laravel laravel-4 laravel-5 laravel-routing

我的项目有两种类型的用户,管理员和客户。我需要阻止客户端通过URL传递ID来访问其他客户端详细信息,如下所述。在这个客户中,有两个类别,高级客户和客户客户。这里我也需要上面的功能。我使用过滤器将管理员和客户端路由到不同的仪表板。我的filter.php文件如下所示。

Route::filter('auth', function()
{
    if (Auth::guest())
    {
        if (Request::ajax())
        {
            return Response::make('Unauthorized', 401);
        }
        else
        {
            return Redirect::route('home');
        }
    }
});

Route::filter('admin', function()
{
    if (Auth::user()->isAdmin != 0) return Redirect::route('getLogout');
});
Route::filter('client', function()
{
    if (Auth::user()->isAdmin != 1) return Redirect::route('getLogout');
});

Thsi正常运作。

但是如果客户端尝试通过URL访问其他客户端详细信息,他将获得它。例如,在我的项目中有一个访问客户端配置文件的URL。这是通过像这样的" localhost / public / profile / {id}"传递客户端ID来完成的。 route.php文件的一部分如下所示。

Route::group(array('before' => 'auth'), function()
{
     Route::group(array('before' => 'auth|client'), function() 
     {
        Route::get('profile/{id}', array('uses' => 'ClientController@viewProfile', 'as' =>'viewProfile'));
     });
});

如何通过使用过滤器或其他方法阻止客户端访问其他客户端配置文件?我尝试在控制器中指定,但看起来不太好。

同样在我的客户中,有两种类型的客户。高级客户和客户。这些类型在名为Client的模型中为表名为clients的客户端指定。在clients表中有一个名为type的字段。我需要阻止访客客户端访问高级客户端可以访问的某些URL。

任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

基本思想是创建一个custom filter来获取当前用户的ID,将其与请求中的用户ID进行比较,然后采取必要的操作,这可能是在其他地方重定向。将此包裹在您希望其影响的任何路线周围。

过滤器看起来像这样:

Route::filter('profile_access', function($route, $request, $value)
{
    $requestedId = $route->getParameter('id');
    $userId = MyUserService::getCurrentUser()->getId();

    // compare and redirect...
});