Laravel:如何限制管理员和组员的路线

时间:2016-06-15 08:49:06

标签: php laravel laravel-5.2 laravel-routing

我目前正在使用Laravel开发一个网站。 用户属于1且仅属于1个组。 如何限制路线

Route::('/view/profile/{id}', 'ProfileController@showProfile');

只能由属于同一组的其他用户访问。我还想让管理员访问此路由。但是,管理员不属于任何组。

2 个答案:

答案 0 :(得分:2)

我知道有两种方法可以解决您的问题。

  1. 您可以为自己的路线创建自定义middlewarebind
  2. 或者您可以对控制器方法进行简单检查。
  3. 我将举例说明第二种方法,因为它是最简单的。

    示例:

    // YourController.php
    
    public function yourMethod()
    {
    
        // Get the user from authentication
        $user = Auth::user();
    
        // Check user and redirect to login when NULL
        // This also can be done with auth middleware (check link in method 1)
        if (!$user) return Response::redirect('yourLoginRoute');
    
        // Check if has not group throw forbidden
        if ($user->group->id != theGroupId) return App::abort(403);
    
    }
    

    评论@PaulLucero后编辑

    因此,如果我理解正确,只有同一组的用户可以访问每个人的个人资料页面(view / profile / {id})。您还希望使用中间件来解决此问题,但无法检索路由参数{id}。

    您可以使用Route::input('yourParameter')在路线外的Laravel 4中检索参数。检查this并向下滚动到访问路线参数值

    示例:

    class YourMiddleware
    {
    
        public function handle($request, Closure $next)
        {
    
            // Get id from route and get user model
            $user_id = Route::input('id');
    
            $user = User::find($user_id);
    
            // Do some checks
            ....
    
            // Get user from auth
            $auth_user = Auth::user();
    
            // Do some checks
            ....
    
            // If groups don't match throw 403
            if ($user->group_id != $auth_user->group_id) return App::abort(403);
    
            return $next($request);
    
        }
    
    }
    

    我认为这应该可以解决问题。

答案 1 :(得分:0)

创建一个像这样的自定义中间件

public function yourMethod()
        {
           $user = Auth::user();
           if ($user->group_id == 1) {
              return Response::redirect('yourRouteToGroupID-1');
           else if(if ($user->group_id == 2) {)
              return Response::redirect('yourRouteToGroupID-2');
           else{
              return App::abort(403);
           }
         }